1

私はかなり新しい暗号化と復号化ですので、このテーマに関する知識が不足していることをお許しください。

Rubyで文字列を復号化しようとしています。文字列は、MCRYPT_RIJNDAEL_128を使用してPHPで暗号化されたサーバーから読み取られます。私はそれをPHPで復号化するためのコードを持っていますが、それは機能し、それをRubyに変換しようとしています。Rhodes(Rubyのモバイルアプリケーションフレームワーク)を使用して作成しているモバイルアプリケーションの認証にこれが必要です。

これは、PHP側での復号化のスニペットです。

  $key = "This is a test key";

  $string2 = hex2bin($string);  // The encrypted string   

  $iv = '1111F321414LOJL018473914DSADAS'; // Just given a random Initialisation vector for the example

  $encrypted = mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $string2, MCRYPT_DECRYPT, $iv);

function hex2bin($str) {
    $bin = "";
    $i = 0;
     do {
       $bin .= chr(hexdec($str{$i}.$str{($i + 1)}));
       $i += 2;
       } while ($i < strlen($str));
    return $bin;
 }

hex2binは、16進数を2進数に変換する関数です。

これまでのところ、Rubyが提供するcrpt:rijndaelライブラリを使用してこの復号化を実行しようとして失敗しました。

key = "This is a test key"
rd = Crypt::Rijndael.new(key, 128, 128)
string = @params['body'] // The encrypted string 
encrypted_string = hex2bin(string) 
decrypted_string = rd.decrypt_block(encrypted_string)

def hex2bin(str)
  bin = ""
  i = 0
  begin
    bin = bin + ((str[i]+str[i+1]).hex).chr
    i = i+2
  end while i<str.length
  return bin
end

「アプリエラー:ブロックの長さは16バイトである必要があります」というエラーが表示されます。http://pastebin.com/m1rsJUXMからの初期化ベクトルを受け入れるようにコードを追加してみました。それでも同じエラーが発生します。どんな種類の助けや指示も大歓迎です。

よろしく、

4

1 に答える 1

1

PHPコードを見ると、明示的なIVと不特定のパディングを使用してCBCモードで128ビットのRijndaelを使用しているようです。パディング(通常はPKCS5またはPKCS7)を明示的に指定することをお勧めします。エラーメッセージがブロックの1つが16バイトの長さではないことを示していることを考えると、最初にパディングの問題を疑う傾向があります。プレーンテキストの最後のブロックが次のブロック境界に埋め込まれていない可能性があるため、必要な16バイトが不足しているため、エラーメッセージが表示されます。

それとは別に、RubyコードでCBCモードを指定して、PHPコードと一致し、暗号文、キー、およびIVが両方のシステムのバイトレベルで同一であることを確認する必要があります。文字列との間で変換を行うと、違いが生じ、問題が発生する可能性があります。これは、ブロックサイズの問題についての私の2番目の考えです。暗号文をバイトから文字列に変換し、再びバイトに戻すと、暗号文の長さが変更される場合、同じエラーメッセージが表示されます。

于 2011-08-23T14:11:55.857 に答える