我一直在尝试使用相同的密钥和iv加密PHP和Ruby中的字符串,但我总是得到不同的结果。
以下是PHP代码
$data = "This string needs to be encrypted";
$key = "1234567887654321abcdefghabcdefgh";
$iv = "1234567887654321abcdefghabcdefgh";
echo $encrypted_data = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
以下是Ruby代码
data = "This string needs to be encrypted"
key = "1234567887654321abcdefghabcdefgh"
iv = "1234567887654321abcdefghabcdefgh"
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.encrypt
aes.key = key
aes.iv = iv
encrypted_data = aes.update(data) + aes.final
有人可以帮我在PHP和Ruby中获取相同的加密数据吗?我在PHP中加密了一些数据,然后在Ruby中解密但没有得到数据。所以我认为问题是PHP和Ruby加密和解密机制的工作方式不同。如果我错了,请纠正我。感谢
答案 0 :(得分:3)
不要硬编码IV,它是不安全的。 IV必须是随机的,但可以是公开的,所以只需使用
mcrypt_create_iv并将其添加到ciphtertext的前面,然后再将其解压缩
解密
您可能有三个问题
填充。 AES仅采用固定的128位块,因此您必须将文本填充为该大小的倍数。 PHP并不是很糟糕,我相信SSL使用pkcs7填充。请注意,即使使用不同的填充方案,对于大多数填充方案,密文的开头也应该相同,最后可能只有垃圾。
字符串编码。 AES是用位输入定义的,在c中通常是字节数组。 Ruby和PHP使用字符串。我愿意打赌你的字符串编码是不同的。