- - PR -
AESで16Byteを暗号化
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-12-12 11:06
Java:j2sdk1.4.2_16
AES/CBC/PKCS5Padding で暗号化プログラムを組みました。 IVを"0123456789012345".getByte()で作成し、"abcdefghijklmnop".getByte() を暗号化てみました。 当初の予定では、AESは128bitブロック暗号なので、16Byte(128bit)のIVで16Byte(128bit)の文字列を暗号化したら、1ブロック分の暗号化Byte(16Byte)が得られると思っていたのですが、2ブロック分の暗号化Byte(32Byte)が出力されてしまいます。 128bitブロック暗号って、127bitまでを1ブロック…だとすると、IVの定義がおかしい気もしますし、少々混乱しております。 なぜ16Byte文字列を暗号化すると32Byteの暗号化Byte列になるのか、ご教示お願いします。 | ||||||||
|
投稿日時: 2007-12-12 11:46
AESは256bitブロック長固定です。AESの元となったラインダール暗号ではブロック長が可変で選ぶことができましたが、AESで採用したときに256bit固定となりました。 128bitって鍵長の話じゃないですか?鍵長とブロック長を混同していません? | ||||||||
|
投稿日時: 2007-12-12 11:54
電子政府推奨暗号リスト
http://www.meti.go.jp/feedback/downloadfiles/i30220ej.pdf に「128 ビットブロック暗号」とあるので128bitごとにブロック区切って、暗号化するのではないでしょうか? 暗号鍵長は米国の輸出規制で128がデフォらしいので、そのまま128使ってます。 ちなみに"abcdefghijklmno".getByte() (15Byte)を暗号化すると1ブロック分(16Byte)の暗号化Byte列が出力されます。 | ||||||||
|
投稿日時: 2007-12-12 12:16
パディングしているせいのような気がします。
メッセージ長(オクテット単位)を||M||とすると、パディング長は 16 - (||M|| mod 16) なので、||M||が16の倍数だと、16オクテットのパディングがつく ように思われます。 | ||||||||
|
投稿日時: 2007-12-12 12:50
ごめんなさい。混同していたのは私のほうでした。orz | ||||||||
|
投稿日時: 2007-12-12 13:23
なんと! 試しに AES/CBC/NoPadding で暗号化してみると、確かに、"abcdefghijklmnop".getByte()の暗号化が16Byte暗号化Byte列になりました。 きっちりブロック長なのに、無駄にPaddingしてるんですねぇ…。(それってパディングというのか?) 謎が解けすっきりです。
ぶっちゃけ、私も理解できずに、左で見つけた資料を右に受け流しているだけなので何とも…。orz なんというか、「暗号化」って言葉の段階で頭の中にイメージがわかず、バカの壁が出来てしまっているようでorz | ||||||||
|
投稿日時: 2007-12-12 14:09
無駄といえば無駄ですが、どうしてもパディング長を入れるフィールドが必要なので、 そうならざるをえない気がしますね。 パディング長が0バイトだと、パディング長を入れる場所がないので。 では。 |
1