OpenSSLTL;DR実験おまけ1おまけ2OpenSSLのPaddingではまったので覚書。block_size)で計算できる実験OpenSSLを使うソースは以下の通り。(inは入力、encは暗号化後のデータ、decは復号したデータ)AESは16バイトを1ブロックとして暗号化するブロック暗号なので、入力が16バイトの場合はちょうど1回AES暗号を行えばOKのはず。実際にやってみると出力は32バイトになっている。Paddingを使っており、デフォルトで有効になっているのが原因。Paddingでは、Paddingがあることが前提なので、暗号化対象データがちょうどブロックサイズの倍数の場合でも、1ブロック分Paddingが追加される。実際に、コードを以下のように変更してPaddingを無効にしてみると、暗号化後も16バイトになる。16だからといって、入力サイズがブロックサイズの倍数かどうかでPaddingの有効/無効を切り替えるのは良くない、というか実現は難しい。Paddingが必要の時にのみPaddingを有効にした場合、生のデータサイズがブロックサイズの倍数であってもそうでなくても、暗号化後は(Paddingされているので)必ずブロックサイズの倍数になる。すると、復号時には元のデータサイズはわからず、Paddingを有効/無効にする判断ができない(またはどこかでそのような情報を持っておくことも考えられるが多分それは間違ってる)。逆にPaddingを常に有効にすると、暗号化時に暗号化後のデータサイズが幾つになるのかを計算する必要がでてくる。block_size)で計算できるので、それを元に出力用のメモリを確保することで対応可能。EVP_{En|De}cryptFinal_exは入力データがブロックサイズの倍数しかない場合は実行する必要はないらしい。ない入力データを受け付ける場合は暗号化でも復号でも必須。片方だけで実行すると復号できなかったりする。暗号化後のデータサイズを求めてバッファを確保Paddingは常に有効(デフォルト)するEVP_{En|De}cryptFinal_exは常に実行するEVP_{En|De}cryptUpdate、EVP_{En|De}cryptFinal_exの出力データサイズ(olen)の合計が実際の暗号化/復号したデータ。復号時は、復号してみないと元データの大きさがわからないので、復号処理の中で余分なデータを削除したりする必要がある(もしくは復号後のサイズも一緒に返す)。いうやり方が正しいそうな感じ。おまけ1opensslコマンドでも-nopadをつけることで同じ事ができる。PaddingがどのようにPaddingをしているのかを確認してみる。@masahiko_sawada。