• ベストアンサー

C#でAES暗号

FreeBSDのコマンドとC#で暗号化した結果が異なります。 何が原因なのでしょうか。 コマンド: echo -n '1' | openssl enc -e -aes-128-cbc -K 1111111111111111 -iv 1111111111111111 -base64 結果>jrSCkCNzo9d4sXlRt5lQ/A== C#: http://programmers.high-way.info/cs/aes.html ここのをキーとIVを変更してます 結果>2OnHWXi3UZDpjnZ6Pex4PQ== 以上です。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

単純に1111111111111111をくだんのプログラムのAesIVとAesKeyにセットしているとしたら、padding, key, ivすべて違うと思います。 opensslのencコマンドのマニュアルを見てみると、-Kや-ivはhexdigitと書いてあります。 https://www.openssl.org/docs/apps/enc.html ちなみに、頭から16進数を入れてみて、長さが足りない場合、0が入るようです。 下記、-ivについてコードを追っかけてみるとこんな感じです。 https://github.com/openssl/openssl/blob/master/apps/enc.c#L274 https://github.com/openssl/openssl/blob/master/apps/enc.c#L467 https://github.com/openssl/openssl/blob/master/apps/enc.c#L604 よって、0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00がKeyやIVに使われます。 一方、くだんのコードでAesIVとAesKeyの設定に使っているGetBytesはこういうものです。 https://msdn.microsoft.com/ja-jp/library/ds4kkd55%28v=vs.110%29.aspx 1と書いてあれば、1の文字コードである0x31が使われるでしょう。 つまり、こちらは0x31 を16バイト分埋めたものがKeyやIVに使われるでしょう。 paddingについても上記で示したOpenSSLのマニュアルにはこう書いてあります。 > All the block ciphers normally use PKCS#5 padding also known as standard block padding: (略) くだんのコードではPKCS7を使っているようです。 '1'はブロック長より短いので最初のブロックからpaddingが入ると思いますが、その方法が違います。 以上をすべてあわせたら同じ結果が出るのではないでしょうか。 なお、#1の回答で出てきたようなもののことをテストベクトル (test vector)と言い、AES-CBCをちゃんと実装していたらすべてこれと同じ結果が出ます。 https://tools.ietf.org/html/rfc3602#page-6

noname#232280
質問者

お礼

詳細な解説ありがとうございました。 実際にコードを追っていくためのよいヒントになり助かります。

その他の回答 (1)

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.1

AES暗号の規格書がweb上のどこかに転がっているはずです。 その規格書の後ろの方にこういうデータを入力したらこういう風に暗号化されるはずという例が載っています。それで確かめたらいいと思います。

noname#232280
質問者

お礼

ありがとうございます。 パラメータに誤りがあったのかと思いました

関連するQ&A