PHP(mcrypt_encrypt)Ruby(AES-256-CBC)加密不同的结果

时间:2012-04-16 20:26:48

标签: php ruby encryption

我一直在尝试使用相同的密钥和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加密和解密机制的工作方式不同。如果我错了,请纠正我。感谢

1 个答案:

答案 0 :(得分:3)

  1. 不要硬编码IV,它是不安全的。 IV必须是随机的,但可以是公开的,所以只需使用
    mcrypt_create_iv并将其添加到ciphtertext的前面,然后再将其解压缩 解密

  2. 您可能有三个问题

    1. MCRYPT_RIJNDAEL_256 is not t AES。 AES是RIJNDAEL的特定版本,采用128位块大小和128或256位密钥标准化。 MCRYPT_RIJNDAEL_256是RIJNDAEL,具有256位块大小。您想使用MCRYPT_RIJNDAEL_128,它实际上是AES。对于php,密钥长度只取决于密钥的长度。所以只需给它一个256位(32个字符)的密钥就可以了。注意块大小确实不会影响安全性,所以不要担心干扰,只需使用带有256位密钥的AES:它足以支持NSA和绝密数据。
    2. 填充。 AES仅采用固定的128位块,因此您必须将文本填充为该大小的倍数。 PHP并不是很糟糕,我相信SSL使用pkcs7填充。请注意,即使使用不同的填充方案,对于大多数填充方案,密文的开头也应该相同,最后可能只有垃圾。

    3. 字符串编码。 AES是用位输入定义的,在c中通常是字节数组。 Ruby和PHP使用字符串。我愿意打赌你的字符串编码是不同的。