パートII:RubyのAES-256-CBCおよびPHP MCRYPT_RIJNDAEL_128が一緒によく遊ぶようにする方法

StackOverflow https://stackoverflow.com/questions/1864700

質問

この質問は<のhref = "に関しては、私の最後の1の続きですhttps://stackoverflow.com/questions/1862710/how-to-make-ruby-aes-256-cbc-and-php-mcryptrijndael128 -play-よく一緒に "> RubyのAES-256-CBCおよびPHP MCRYPT_RIJNDAEL_128よく一緒にに遊ぶにする方法。私は今働いていることを持っているが、私はまだ他の方向に行くのに苦労しています。 PHP生成された暗号が提供されたすべての情報を持っているように見えますが、私はRubyのコードがエラーなしでそれを解読することができません。

ここで私は、暗号文を生成するために使用しているPHPのコードは次のとおりです。

$cleartext = "Who's the clever boy?";
$key = base64_decode("6sEwMG/aKdBk5Fa2rR6vVw==\n");
$iv = base64_decode("vCkaypm5tPmtP3TF7aWrug==");
$cryptogram = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $cleartext, MCRYPT_MODE_CBC, $iv);
$result = base64_encode($cryptogram);
print "\n'$result'\n";

RESULT
'JM0OxMINPTnF1vwXdI3XdKI0KlVx210CvpJllFja+GM='

そして、ここではRubyで解読しようとする試みです。

>> cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
>> cipher.key = Base64.decode64("6sEwMG/aKdBk5Fa2rR6vVw==\n")
>> cipher.iv = Base64.decode64("vCkaypm5tPmtP3TF7aWrug==")
>> cryptogram = Base64.decode64('JM0OxMINPTnF1vwXdI3XdKI0KlVx210CvpJllFja+GM=')
>> cleartext = cipher.update(cryptogram)
=> "Who's the clever"
>> cleartext << cipher.final
OpenSSL::Cipher::CipherError: bad decrypt
 from (irb):100:in `final'
 from (irb):100

このことについては本当にイライラする何それは暗号化された文字列のうち、全体の平文を得ることが可能であるということです。上記を繰り返すが、暗号文にナンセンスパッドを追加

  >> cleartext = cipher.update(cryptogram + 'pad')
  => "Who's the clever boy?\000\000\000\000\000\000\000\000\000\000\000"
  >> cleartext << cipher.final
  OpenSSL::Cipher::CipherError: bad decrypt
   from (irb):119:in `final'
   from (irb):119
(あなたが尋ねることから、JSON文字列を)

は、私の実際の使用の場合、平文が構成されているので、私は、私はこの方式を使用してcipher.finalを行うことなく、悪い暗号化された入力を検出伝えることができ、この点を快適に感じます。しかし、私は私のコードでその場しのぎのこの種を容認することはできませんので、私はRubyのコードが正常最後のブロックを扱うようにする方法を理解したいと思います。

役に立ちましたか?

解決

問題は、RubyのOpenSSLの結合は、PKCSパディングされ、デフォルトのOpenSSLのパディング方式を使用しています一方mcryptは、最後のブロックをパディングされていないということです。私は実際にはOpenSSLのドキュメントからの説明に向上させることはできません。

  n個のパディングを追加することにより、

PKCSパディング作品   値Nのバイトは、全体を作ります   データaの長さ   ブロックサイズの倍数。パディングは、   データがすでにあるので、もし常に追加   ブロックサイズnの倍数意志   ブロックサイズに等しいです。たとえば   ブロックサイズは8と11バイトであります   5パディングバイト、その後暗号化します   値5の加算されます。

は、手動で暗号化する前に、PHPでクリアテキストの最後に適切なパディングを追加する必要があります。あなたは(ブロックサイズとして渡し$cleartext)、それを暗号化する前にこれを行うには、PHP側でこのpkcs5_pad機能を通して、あなたの16を渡します。

function pkcs5_pad ($text, $blocksize)
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}
あなたはまた、他の道を行く場合は、

あなたが復号化した後のパディングバイトを取り除く必要があるでしょう、(Rubyでの暗号化と復号化mcryptので)ます。

のサイドノート:のあなたはクリアテキストが既にブロックサイズ(パディングの全ブロック)の倍数であっても、パディングを追加する必要があります理由は、あなたが解読されたとき、あなたがいることを知っているので、ということです最後のブロックの最後のバイトはパディングのの常にの量が追加されます。そうでなければ、あなただけの値0x01で終了することが起こっていないパディングバイトを持つ単一のパディングバイトと平文との違いと平文を伝えることができませんでした。

他のヒント

これは、それを暗号化する前に、PHPの\0パッドにクリアテキストを表示されます。あなたはパディングを無効にするにはルビーを設定することができます。

<のhref = "http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/Cipher.html#method-i-padding-3D" のrel = "nofollowを「> http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/Cipher.html#method-i-padding-3D の

これは動作しますが、その後、手動でパディングを取り除く必要があります。

1.9.3p125 :008 > cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
 => #<OpenSSL::Cipher::Cipher:0x0000000561ee78>
1.9.3p125 :009 > cipher.decrypt
 => #<OpenSSL::Cipher::Cipher:0x0000000561ee78>
1.9.3p125 :010 > cipher.padding = 0
 => 0
1.9.3p125 :011 > cipher.key = Base64.decode64("6sEwMG/aKdBk5Fa2rR6vVw==\n")
 => "\xEA\xC100o\xDA)\xD0d\xE4V\xB6\xAD\x1E\xAFW"
1.9.3p125 :012 > cipher.iv = Base64.decode64("vCkaypm5tPmtP3TF7aWrug==")
 => "\xBC)\x1A\xCA\x99\xB9\xB4\xF9\xAD?t\xC5\xED\xA5\xAB\xBA"
1.9.3p125 :013 > cryptogram =  Base64.decode64('JM0OxMINPTnF1vwXdI3XdI2j8NJ8kr+Du0fnkxorNl0=')
 => "$\xCD\x0E\xC4\xC2\r=9\xC5\xD6\xFC\x17t\x8D\xD7t\x8D\xA3\xF0\xD2|\x92\xBF\x83\xBBG\xE7\x93\x1A+6]"
1.9.3p125 :014 > cleartext = cipher.update(cryptogram)
 => "Who's the clever girl?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1.9.3p125 :015 > cleartext << cipher.final
 => "Who's the clever girl?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"



1.9.3p125 :042 > cleartext.strip
 => "Who's the clever girl?"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top