• ベストアンサー

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

  • opensslを使ったAES暗号化について

    opensslを使ったAES暗号化について教えて下さい。 AESは「鍵とブロックの長さはそれぞれ128ビット、192ビット、256ビットの中から指定できる。」とありました。 opensslのAESを使って鍵長とブロック長をともに256ビットで暗号化したい場合どのようにすれば宜しいでしょうか。 openssl enc -e -aes256 -in original.txt -out crypted.txt 上記コマンドを打った場合 -aes256 というのがブロック長(256ビット)の指定と思っていますがあってますでしょうか? 残りの鍵長を256ビットにするというのは どのように指定すれば宜しいでしょうか。 何卒 宜しくお願い致します。

  • AES暗号にて、AES_set_encrypt_keyで設定されるAES_KEYについて

    VC++2008にてopensslを用いて、AES暗号/復号の機能を作成しています。 AES_set_encrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_ENCRYPT)にて暗号、 AES_set_decrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_DECRYPT)にて復号するコーディングをしました。 (http://d.hatena.ne.jp/hnko/20090302/1235977892のenc_aes128_cbc_test()を参考にしましたので、 一連の流れは、こことほぼ同じです) デバッグしてみると、一見、暗復号が問題なく出来ていたので、 AES_set_encrypt_key関数の第一引数のkey配列の値と、 ivec配列の値を変えて、デバッグしてみたところ、 key配列を変更すると、暗号化後の文字列も変更されますが、 ivec配列を変更しても、暗号後の文字列に変化が有りませんでした。 調べてみたところ、AES_set_encrypt_keyにて返される AES_KEYのroundsの値が常に同じであることが原因と思われますが、 roundsの値が常に一定だと、暗号解読が比較的容易に 出来てしまうと思うのですが、上記で挙げたサイトでの コーディングの他に、何か別にコーディングを足さなければならないのでしょうか? よろしくお願いします。

  • openSSLのAES暗号化アルゴリズム関数仕様 (C言語開発)

    openSSLのAES暗号化アルゴリズムを使用して、暗号化と復号化の処理 をC言語で作成したいのですが、関数の仕様書を見つけることができません。 尚、openSSLの公式Pageにも載ってませんでした><; 関数仕様書を入手できるHP、或いは書籍(有料でも良いです)などございましたら、 ご教授の程、お願い致します。

  • 暗号化について

    はじめまして。 暗号化について教えて下さい。 ファイルを秘密鍵方式で暗号化、複合化を行うのですが 暗号化する前のファイルのバイト数と暗号化されたあとの ファイルのバイト数は必ず同じになるのでしょうか? ソースの内部で処理を行う予定なのですが、 最初に暗号化前のファイルの大きさだけ 暗号化後のファイルの領域を確保しようと考えています。 今回、暗号化を行うのは OpenSSLのRC2(40bit)です。 コマンドは 「openssl -e -rc2-40-cbc -in 暗号化前ファイル -out暗号化後ファイル」 です。 もう一つ教えていただきたいのですが、鍵の設定は上記のコマンドの末尾に「-K 鍵」で合ってますか? 以上です。よろしくお願いいたします。

  • Ruby 暗号化したファイルの復号について

    Rubyでファイルを暗号化し、それを復号したいのですがうまくいかないため、 質問させていただきます。 Ruby 1.9.3を使用しています。 ・ファイルの暗号化 encrypt.rb ------------------------------------------------- # encoding: cp932 require 'openssl' def encrypt(file, pass)   enc = OpenSSL::Cipher::AES256.new('CBC')   enc.encrypt   enc.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.sec", 'wb') do |fout|       while buff = fin.read(8000)         fout.write(enc.update(buff))       end       fout.write(enc.final)     end   end   enc.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       encrypt(arg, pass)       puts "#{arg}を暗号化したファイル#{arg}.secを作りました。"     rescue       puts "#{arg}の暗号化に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- ・ファイルの復号 decrypt.rb ------------------------------------------------- # encoding: cp932 def decrypt(file, pass)   dec = OpenSSL::Cipher::AES256.new('CBC')   dec.decrypt   dec.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.plain", 'wb') do |fout|       while buff = fin.read(512)         fout.write(dec.update(buff))       end       fout.write(dec.final)     end   end   dec.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       decrypt(arg, pass)       puts "#{arg}を復号したファイル#{arg}.plainを作りました。"     rescue       puts "#{arg}の復号に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- コマンドプロンプトでencrypt.rb自身を暗号化し、encrypt.rb.secの作成はできるのですが、 decrypt.rbを実行してパスワードを入力しても復号ができません。 どのようにすれば復号できるのか教えていただけますでしょうか。

    • ベストアンサー
    • Ruby
  • OpenSSL の 3DES についての理解を深めたいです

    OpenSSLでの3DESを勉強しているのですが、以下コマンドが理解できないのでご教授ください。 ※そもそも暗号化処理自体あまり理解しておりませんorz $ echo hoge | openssl enc -des3 -base64 -k 'yyyy' U2FsdGVkX19vTigKtKhZM9VVTAHQv0fP 3DESといえば鍵を3つ(もしくは2つ)使わなければいけないと考えているのですが、上記コマンドでは特に鍵を複数指定しているとは思えません。 (パスワードのyyyyのみ) なぜ鍵を複数指定せずともdes3で暗号化された文字が出力されるのでしょうか? また、鍵を複数(2つもしくは3つ)指定して暗号化するにはどのような方法があるのでしょうか? 上記どちらかでもよいので、ご存知の方のご回答を聞きたいです。 また参考になるURL等ご提示頂けるとありがたいです。

  • OPENSSLをC言語で

    OPENSSLを使用して暗号化と復号化の処理をC言語(VC++)で 作りたいのですが、C言語からの関数の仕様書を見つけることが できません。一覧表は見つけたのですがこれでは機能がわからなくて 困っています。 また、例題としてコマンドラインからの例は、入手できたのですが これがCの関数になるとどのようになるのか解かりません。 関数仕様書を入手できるHPを教えてください。 (英語のサイトも探しましたが、挫折しました) こんな、馬鹿な質問で申し訳ありません。

  • Solaris8でOpenSSLのインストール

    Solaris8 2001年10月1日版に openssl-0.9.6cをソースからコンパイルしておりますがmakeでエラーがでました。対処方法や調査方法等をご教授いただけないでしょうか ***エラーの内容 *** Error code 1 make: Fatal error: Command failed for target `cbc_enc.o' Current working directory /export/home/sunset/openssl-0.9.6c/crypto/des *** Error code 1 make: Fatal error: Command failed for target `subdirs' Current working directory /export/home/sunset/openssl-0.9.6c/crypto *** Error code 1 make: Fatal error: Command failed for target `sub_all'

  • C#での暗号化(AES)

    初めてのプログラミングにて不明な部分があるので 知恵を貸して頂けませんでしょうか。 現在、C#にて16進で生成された値を 指定秘密鍵を使用してAES暗号化を行たいです。 C#での暗号化のサンプルは多数Webにて見ましたが 指定秘密鍵を使用しての方法がどうしてもわからなくて困っています。 どなたかサンプルURL等ご存知でしたら教えて頂けませんでしょうか、 よろしくお願い致します。

  • Googleのソースコード検索(http://www.google.c

    Googleのソースコード検索(http://www.google.com/codesearch?hl=ja)で、 FreeBSDのコマンドのソースコードを探しています。 検索結果からソースコードを表示させようと、クリックするのですが、 ページでエラーが発生して表示させることができません。 例えば、言語:C、パッケージ:FreeBSD、ファイル:grep として検索して出てきた結果が開けません。 Windows XPでInternet Explorer8.0です。 なにか問題があるのでしょうか? 教えてください。 よろしくお願いします。