我一直在尝试使用相同的 key 和 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 加密和解密机制的工作方式不同。如果我错了,请纠正我。谢谢
最佳答案
不要对 IV 进行硬编码,这是不安全的。 IV 必须是随机的,但可以是公开的,所以只需使用
mcrypt_create_iv 并将其添加到密文的前面,然后在之前提取它 解密你可能有三个问题
- MCRYPT_RIJNDAEL_256 is not t AES。 AES 是一个特定版本的 RIJNDAEL,它被标准化为 128 位 block 大小和 128 位或 256 位 key 。 MCRYPT_RIJNDAEL_256 是具有 256 位 block 大小的 RIJNDAEL。您想使用实际上是 AES 的 MCRYPT_RIJNDAEL_128。对于php, key 长度只是由 key 的长度决定的。所以只要给它一个 256 位(32 个字符)的 key 就可以了。请注意, block 大小不会真正影响安全性,所以不要担心尊重,只需使用带有 256 位 key 的 AES:它足以用于 NSA 和绝密数据。
填充。 AES 只采用固定的 128 位 block ,因此您必须将文本填充为该大小的倍数。 PHP 还不错,我相信 SSL 使用 pkcs7 填充。请注意,即使使用不同的填充方案,对于大多数方案来说,密文的开头应该相同,只是结尾可能是垃圾。
字符串编码。 AES 是用位输入定义的,在 c 中通常这是一个字节数组。 Ruby 和 PHP 使用字符串。我愿意打赌你的字符串编码是不同的。
关于PHP (mcrypt_encrypt) Ruby (AES-256-CBC) 加密不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10181193/