Bu soru ile ilgili olarak, benim sonuncusu bir devamıdır How to make Ruby AES-256-CBC and PHP MCRYPT_RIJNDAEL_128 play well together. Ben şimdi bu çalışma var, ama ben yine de diğer yöne gitmek için mücadele ediyorum. PHP oluşturulan kriptogram sağlanan tüm bilgilere sahip gibi görünüyor, ama ben hata olmadan şifresini Ruby kodu alınamıyor.
İşte kriptogramını oluşturmak için kullanıyorum PHP kodu:
$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='
Öyleyse buraya Ruby şifresini çözmek için girişimde bulunuyor:
>> 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
Ne bu konuda gerçekten sinir bozucu o şifreli dize dışında tüm düz metin elde etmek mümkün olmasıdır. Yukarıdaki tekrarlanması, ancak Kriptogramın bir saçmalık pad ekleyerek:
>> 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
Benim gerçek kullanım durumunda (sizden yana, JSON dize) cleartext yapılandırılmıştır, bu yüzden ben bu düzeni kullanmak anlatmak ve cipher.final
yapmadan zayıf şifreli girişini tespit olabilecek bu noktada rahat hissediyorum. Ancak, benim kodunda kludge bu tür tahammül edemez, bu yüzden ben yakut kod incelikle son bloğu işlemek nasıl anlamak istiyorum.