AES / CBC用Java加密,用Ruby解密
|
我正在尝试将以下(有效的)Java代码转换为Ruby。
public static final String PROVIDER = \"BC\";
public static final int IV_LENGTH = 16;
private static final String HASH_ALGORITHM = \"SHA-512\";
private static final String PBE_ALGORITHM = \"PBEWithSHA256And256BitAES-CBC-BC\";
private static final String CIPHER_ALGORITHM = \"AES/CBC/PKCS5Padding\";
private static final String SECRET_KEY_ALGORITHM = \"AES\";
public String decrypt(SecretKey secret, String encrypted) {
Cipher decryptionCipher = Cipher.getInstance(CIPHER_ALGORITHM, PROVIDER);
String ivHex = encrypted.substring(0, IV_LENGTH * 2);
String encryptedHex = encrypted.substring(IV_LENGTH * 2);
IvParameterSpec ivspec = new IvParameterSpec(HexEncoder.toByte(ivHex));
decryptionCipher.init(Cipher.DECRYPT_MODE, secret, ivspec);
byte[] decryptedText = decryptionCipher.doFinal(HexEncoder.toByte(encryptedHex));
String decrypted = new String(decryptedText, \"UTF-8\");
return decrypted;
}
我的(不起作用的)Ruby代码是这样的:
require \'openssl\'
require \'digest/sha2\'
SECRET = \"MY PASSWORD AS RAW TEXT\"
IV_LENGHT = 16
encoded = \"45D0EC4D910C0A6FF67325FF7362DCBC4613B6F3BFDFE35930D764FB1FE62251\"
iv = encoded.slice(0, IV_LENGHT * 2)
e = encoded.slice(IV_LENGHT*2..-1)
binary_iv = iv.unpack(\'a2\'*IV_LENGHT).map{|x| x.hex}.pack(\'c\'*IV_LENGHT)
binary_e = e.unpack(\'a2\'*IV_LENGHT).map{|x| x.hex}.pack(\'c\'*IV_LENGHT)
c = OpenSSL::Cipher::Cipher.new(\"aes-256-cbc\")
c.decrypt
c.key = Digest::SHA256.digest(SECRET).slice(0, IV_LENGHT* 2 )
c.iv = binary_iv
d = c.update(binary_e)
d << c.final
puts \"decrypted: #{d}\\n\"
我尝试过二进制和非二进制版本,但没有运气。
有人可以指出问题吗?
没有找到相关结果
已邀请:
2 个回复
才脊烽馈低
运行上面的命令将导致类似以下输出的结果。
十六进制字符串用于加密的消息和初始化向量,因为您可以使用OpenSSL来验证加密/解密过程(强烈建议)。 现在,从Ruby程序中,您将使用ѭ5cip密码,并从
和
字符串(不是Java的
)派生密钥。使用上述Java程序的输出,我们可以:
注意:该代码的Ruby部分几乎完全来自
标准库的日语文档。
郡豪靠暖