Этот вопрос является продолжением моей последней, касающейся Как сделать Ruby AES-256-CBC и PHP MCRYPT_RIJNDAEL_128 хорошо взаимодействовать. Сейчас у меня это работает, но я все еще стараюсь идти в другую сторону. Сгенерированная PHP криптограмма имеет всю информацию, которая была предоставлена, но я не могу заставить Ruby-код расшифровывать его без ошибок.
Вот код PHP, который я использую для генерации криптограммы:
$cleartext = "Who 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 the clever"
>> cleartext << cipher.final
OpenSSL::Cipher::CipherError: bad decrypt
from (irb):100:in `final'
from (irb):100
Что действительно разочаровывает в этом, так это то, что можно извлечь весь текст из этой зашифрованной строки. Повторяя вышеизложенное, но добавляя в криптограмму вздорную площадку:
>> cleartext = cipher.update(cryptogram + 'pad')
=> "Who 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
. Тем не менее, я не могу терпеть такого рода kludge в своем коде, поэтому я хотел бы понять, как сделать код ruby обработанным окончательным блоком изящно.