この質問は、 RubyAES-256-CBCとPHPMCRYPT_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
です。ただし、コード内でこの種のクラッジを許容することはできないため、ルビーコードで最後のブロックを適切に処理する方法を理解したいと思います。