1

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

4

1 回答 1

3
  1. 不要对 IV 进行硬编码,这是不安全的。IV 必须是随机的,但可以是公开的,因此只需使用
    mcrypt_create_iv 并将其添加到密文的前面,然后在解密之前将其提取出来

  2. 你可能有三个问题

    1. MCRYPT_RIJNDAEL_256 不是AES。AES 是一个特定版本的 RIJNDAEL,它采用 128 位块大小和 128 位或 256 位密钥进行标准化。MCRYPT_RIJNDAEL_256 是具有 256 位块大小的 RIJNDAEL。您想使用实际上是 AES 的 MCRYPT_RIJNDAEL_128。对于 php,key 的长度只是由 key 的长度决定的。所以只要给它一个 256 位(32 个字符)的密钥就可以了。请注意,块大小并不会真正影响安全性,因此不必担心这种尊重,只需使用 256 位密钥的 AES:它对于 NSA 和绝密数据来说已经足够了。
    2. 填充。AES 只采用固定的 128 位块,因此您必须将文本填充为该大小的倍数。PHP 还不错,我相信 SSL 使用 pkcs7 填充。请注意,即使使用不同的填充方案,对于它们中的大多数来说,密文的开头应该是相同的,最后可能会有垃圾。

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

于 2012-04-16T20:41:53.797 回答