Camelliaでファイルを暗号化してみる
ZIPファイルフォーマット(コンテナ)のように、Camelliaで暗号化した
ファイルを格納できる標準のファイルフォーマットはないようだ。
折角の国産暗号モジュールなので独自にファイルフォーマットを
定義して任意のファイルをCamelliaで暗号化してみる。
必要な準備
以下の静的ライブラリを使う前提
- strlcpy(http://d.hatena.ne.jp/mballack/20110601)
- libcamellia.a(http://d.hatena.ne.jp/mballack/20110508/1304814545)
ファイル化するに当たっての留意事項
- Camelliaオープンソースは16バイト毎に暗号化する。例えば3バイトしかないファイルであっても残りの13バイトの情報が必要になる。従って暗号化したファイルにはその余分な分を含めなければならない。
- 暗号化したファイルには余計な分を格納するが、復元したファイルには余計な分を含んではならない。従って暗号化ファイルにはオリジナルのファイルの長さ情報を保持していなければならない。
- 故に、暗号化ファイルには何らかのヘッダ情報を付加する必要がある。そのヘッダ構造体のメンバには複数バイトフィールドも必須であろう。この際、エンディアンと構造体のpack化は必ずケアしなければならない。
- (2011/06/29追記)復号化されたファイルが正しいものかどうか判定用のベリファイデータが実用上は欲しい。解読されにくさとは反比例するが大事なデータを失わないようにするほうが重要。徹底的に解読されにくさを追求するならソースなど公開すべきではないが、あくまでexampleとしての公開である。
Camellia暗号化ファイルの独自フォーマット(コンテナ)を定義
以下のように決めてみる。標準化を目指そうなどと大それたことを考えたものではない。
あくまでexampleである。暗号化に使用したキーはファイルには含めない。
パスワード(キー)を忘れたら永久に復元できないであろう。(Camelliaが強固であれば)
All multi-bytes fields are little-endian +---------------------------+ | ID | 4bytes 'C' 'A' 'M' 'E' (0x43,0x41,0x4D,0x45) +---------------------------+ | Version Major | 1byte Major Version (1) +---------------------------+ | Version Minor | 1byte Minor Version (1) +---------------------------+ | Key length | 2bytes 128,192,256 +---------------------------+ | Length | 4bytes file length (Max 4GB) +---------------------------+ | Verify data | 32bytes added Version 1.1 +---------------------------+ | Reserve | 20bytes reserve (all 0) +---------------------------+ | | | | : Encrypted file contents : Length + α (16 x N size) | | | | +---------------------------+
暗号化・復号化ツールの仕様を以下とする
- キーは常に256bitの最強強度とする。デフォルトでは適当に決めた256bit(32バイト)のキー値を持ち、これに暗号化する際に指定したパスワード(キー)の長さ分を先頭から上書きする。
- 暗号化ファイルの拡張子を.camlとする。オリジナルのファイル名にこの拡張子を付加する。(例:original.dat → original.dat.caml)
- 指定したファイルの拡張子が.camlであれば復号化し、それ以外なら暗号化する
指定例:
- camefile PASSWORD original.dat → original.dat.camlとして暗号化ファイルを生成
- camefile PASSWORD original.dat.caml → original.datとして元のファイルを生成