シンプルでモダンでセキュアなファイル暗号化ツールとファイルフォーマットとRustのライブラリのabcryptを作成したので紹介します。
abcrypt暗号化データフォーマットとは
abcrypt暗号化データフォーマット (英語: abcrypt encrypted data format) は、認証付きのモダンなファイル暗号化フォーマットです。
このファイルフォーマットはscrypt encrypted data formatから着想を得ており、秘密鍵の導出にはArgon2idを使用し、ヘッダーの認証にはBLAKE2b-512-MACを使用し、データの暗号化にはXChaCha20-Poly1305を使用しています。 このファイルフォーマットを作成したのは、scrypt encrypted data formatの秘密鍵の導出の部分をArgon2に変更したものを作成してみたいと思ったのがきっかけです。 scrypt encrypted data formatではヘッダーの認証にHMAC-SHA-256を使用していますが、abcryptフォーマットではArgon2idがBLAKE2bを使用していることと、BLAKE2bがHMACを使わないでそれ自体でメッセージ認証コード (MAC) を出力することができるので、BLAKE2b-512-MACを使用しています。 データの暗号化部分はBLAKE2bと同様にChaChaをベースとしていることと、認証付き暗号であることと、ChaCha20-Poly1305とは異なりノンスに暗号論的擬似乱数生成器 (CSPRNG) で生成した値を使用できるので12、XChaCha20-Poly1305を使用しています。
詳細な仕様はhttps://sorairolake.github.io/abcrypt/book/format.htmlを参照して下さい。
ライブラリについて
abcryptフォーマットを実装したRustのライブラリのabcrypt
を作成しました。
これは私が以前に作成したscrypt encrypted data formatの実装のscryptenc
をベースにしています。
このライブラリはno_std
環境で使用することができ、default
featureを無効にすることで使用することができます。
この場合にヒープの使用を許容できる場合は、alloc
featureを有効にします3。
alloc
featureを有効にした場合は暗号化や復号したデータをVec<u8>
として出力することができ、暗号化や復号するデータの長さが事前に分かっていない場合に使用できます。
このライブラリでは暗号化や復号するデータはスライス ([u8]
) で保持しており、暗号化や復号するデータの長さが事前に分かっている場合は出力を書き込むためのバッファを固定長の配列で確保して処理することもできるので、メモリ効率は良いはずです。
APIの詳細はhttps://docs.rs/abcryptを参照して下さい。
バインディングについて
このライブラリをC言語でも利用できるようにするためにバインディングのabcrypt-capi
も作成しました。
C言語のAPI (ヘッダーファイル) の詳細はhttps://sorairolake.github.io/abcrypt/book/capi/capi.htmlを、RustのAPIの詳細はhttps://docs.rs/abcrypt-capi参照して下さい。
ファイル暗号化ツールについて
abcryptフォーマットを利用してファイルの暗号化を行うためのコマンドラインユーティリティのabcrypt-cli
を作成しました。
コマンド名はabcrypt
です。
これは私が以前に作成したscrypt(1)
のRust実装のscryptenc-cli
をベースにしています。
基本的なファイルの暗号化は以下のコマンドで行います。
|
|
また、基本的なファイルの復号は以下のコマンドで行います。
|
|
暗号化時にはコマンドラインオプションでArgon2パラメータを指定することができます4。
パスフレーズは/dev/tty
、標準入力、環境変数またはファイルから入力することができます。
また、コマンドラインオプションでシェル補完スクリプトを生成することもできます。
詳細な利用方法はhttps://sorairolake.github.io/abcrypt/book/cli/index.htmlやmanページを参照して下さい。
終わりに
abcryptの紹介をしました。
気に入ってもらえたらsorairolake/abcryptでStarを付けてもらえるとありがたいです。 abcryptの改善のためにIssueやPull Requestもお待ちしています。
有効にしない場合はArgon2で秘密鍵を導出する際に使用するメモリブロックの大きさが制限されます (v0.2.5の時点では256 KiB)。 ↩︎
指定しない場合はOWASP Cheat Sheetの推奨値を使用します。 ↩︎