Я пытаюсь преобразовать этот PHP-код в Ruby, но результат не тот. Что я делаю неправильно?
$iv = str_repeat('0', 16);
$passphrase = str_repeat('0', 32);
$encrypted = openssl_encrypt('Hello', 'AES-256-CBC', $passphrase, 0, $iv);
echo $encrypted; // => lfbW8JcPq6dkEnmY0hG7Vw==
cipher = OpenSSL::Cipher.new('AES-256-CBC').encrypt
cipher.iv = '0' * 16
cipher.key = '0' * 32
encrypted = cipher.update('Hello') + cipher.final
puts encrypted # => \x95\xF6\xD6\xF0\x97\x0F\xAB\xA7d\x12y\x98\xD2\x11\xBBW
Результат в основном тот же.
Если вы попытаетесь закодировать AES 256 CBC, вы можете перейти по этой ссылке: '%7D,%7B'option':'UTF8','string':'0000000000000000'%7D,'CBC','Raw','Hex',%7B'option':'Hex','string': ''%7D)&input=SGVsbG8
Как видите, я закодировал "hello" в AES CBC с вашим ключом и IV (оба в UTF8)
Результатом в формате HEX является 95f6d6f0970faba764127998d211bb57
, который в основном соответствует строке Rails за вычетом управляющей последовательности \x
Теперь строка PHP немного отличается, но это потому, что она была закодирована BASE 64.
Вы можете зайти сюда https://base64.guru/converter/encode/hex и скопировать 95f6d6f0970faba764127998d211bb57
в верхнее поле, результат будет lfbW8JcPq6dkEnmY0hG7Vw==
РЕДАКТИРОВАТЬ
Просто обратите внимание, что строка Rails немного отличается от Hex, предоставленной CyberChef, в последних символах. Может быть, кто-то может дать более подробную информацию о том, что нотация Rails немного отличается от HEX, вместе с escape-последовательностью \x
. Я читал, что это характерно для языка C (Ruby закодирован на C, что может объяснить нотацию C с помощью \x
).
Я предлагаю вам использовать Base64 # encode64, чтобы получить тот же результат, что и в вашем примере php.
require 'Base64'
puts Base64.encode64(encrypted) # => lfbW8JcPq6dkEnmY0hG7Vw==