A certain engineer "COMPLEX"

開発メモ その202 libsodiumでファイル暗号化 (XChaCha20-Poly1305)

libsodiumでファイル暗号化を試してみました。

Introduction


何故ファイル暗号化にlibsodiumが必要なのかというと

  • C++で使いたい
  • OpenSSLはビルドが面倒
  • ライセンスが緩い

という3点です。

そんなlibsodiumはこちら

A modern, portable, easy to use crypto library. Contribute to jedisct1/libsodium development by creating an account on GitHub.

Networking and Cryptography library (NaCL)の構成コンポーネントのフォークです。

  • クロスプラットフォーム
  • ISCライセンス
    • 2条項BSDライセンスと同等
  • 開発が活発
  • PHP 7.2から暗号化のコアとして採用

という特徴があります。

そんあlibsodiumを使って暗号化処理を試してみました。

How to do?


ソースは下記です。

Sample source code for Demonstration, Experiment and Test - takuya-takeuchi/Demo

公式提供のサンプルコードをベースにしているのですが、

  • C++化
    • iostreamを使っているためfopenとか除去
  • 引数チェックなど追加
  • libsodiumをCMakeから利用
  • libsodiumは静的リンク

と改良してあります。

暗号方式は、ChaCha20-Poly1305になります。
詳細はググっていただければと思いますが

とモダンな感じがするアルゴリズムです。

そして、libsodiumにはChaCha20-Poly1305の実装として下記が提供されています。

  • ChaCha20-Poly1305 (オリジナル実装)
  • IETF ChaCha20-Poly1305
  • XChaCha20-Poly1305 (今回使ったのはこれ)

実装の際は、Nonceの長さやメッセージの最大長が違ったりするといった感じに見えます。

(今回使った)XChaCha20-Poly1305での暗号/復号化に必要なのはKEYのみ。
どうも、Nonceは暗号化ファイルのヘッダーに埋め込まれる感じに見えます。
ただ、ヘッダー自体がKEYを使って生成されているので、Nonceが生で入っているような感じでは無いです (未確認)

ヘッダーにnonceフィールドがあるのできっとそうなのでしょう。

また、暗号化は

  1. ヘッダー挿入
  2. チャンクサイズ(4096)毎に暗号化

するだけです。
復号化も

  1. ヘッダー解析
  2. チャンクサイズ(4096)毎に復号化

というシンプルさなのも実装が容易で好ましいです。

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。