2011-01 / 2011-01-25

前のエントリ: itemページのタイトルにカテゴリ表示 [chalow]
次のエントリ: PKCS#5パディングでAES暗号化/復号 [Android]

PKCS#5パディングでAES暗号化/復号
2011-01-25-1 / カテゴリ: [暗号][perl] / [permlink]

メモってたつもりが書いてなかったので今更シリーズ


ちゃっちゃと進めよう。ソース
use Crypt::CBC;
sub cryptaes {
  my $is_enc = shift;
  my $key = shift;
  my $iv = shift;
  my $src = shift;

  my $cipher = Crypt::CBC->new( { key => $key,
				  keysize => length $key,
				  literal_key => 1,
				  cipher => "Rijndael",
				  iv => $iv,
				  padding => "standard",
				  prepend_iv => 0,
				  header => "none",
				});

  if ($is_enc) {
    return $cipher->encrypt($src);
  }
  else {
    return $cipher->decrypt($src);
  }
}
こんな感じで。
第1引数に 1(暗号化する) か 0(復号する)を指定。
第2引数に共通鍵(16/24/32Byte限定)。
第3引数にIV(Initialization Vector)を指定。
第4引数に暗号化/復号対象のスカラ変数。
を突っ込めば、暗号化または復号結果がreturnされる。

こんな感じ。
my $cryptdat = cryptaes(1, "thisis secretkey", "0123456789abcdef", $plain_data);

Perl以外のシステムとデータ交換するなら、Crypt::CBC使用時の literal_key は指定したほうがベター。
指定なし(literal_keyがオフ)の場合は、モジュール内で共通鍵のMD5ダイジェストを使用して暗号化/復号処理が行われる。(その副作用で、任意の鍵長が指定可能)
逆に言うと、Perl側でliteral_keyがオフのシステムとやりとりしたければ、共通鍵のMD5ダイジェストで暗号化/復号すればOK(のはず。少なくとも自分で確認した限りの環境では)

PKCS#5ってのは、簡単に言うとブロック暗号処理を任意のデータ長にかますための約束事のひとつ。
ブロック暗号は通常決められたブロックサイズに対する暗号処理のため、たとえばAESは16(128bit)、24(196bit)、32(256bit)のブロック暗号なので、このサイズのデータでなければ暗号化できない。
そこで足りない分に詰め物(padding)をして、規定のサイズにした上で暗号化を行う。

といろいろ書き始めたけど、ここを読んだ方が早い。
データの尻尾に「詰め物のサイズはxバイトですよ」のバイナリxをxbyte分埋めるってわけだ。
その指定が padding => 'standard" の部分。というか省略可能。

その他のパラメタは、暗号化/復号にあたって、(literal_keyのように)入力と出力をできるかぎりゴニョゴニョしない指定。
ほかの環境(JavaのシステムとかCで組み込みとか何とか)とのやりとりがある場合は、この辺を指定したほうが無難かもしれない。

AES以外のブロック暗号アルゴリズムは、cipherの指定を変えてあげればOK

バージョン古いけど、日本語の情報はこのへんで。
Referrer (Inside): [2011-01-25-2]
前のエントリ: itemページのタイトルにカテゴリ表示 [chalow]
次のエントリ: PKCS#5パディングでAES暗号化/復号 [Android]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12