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

标签 php ruby encryption

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

最佳答案

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

  2. 你可能有三个问题

    1. 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 和绝密数据。
    2. 填充。 AES 只采用固定的 128 位 block ,因此您必须将文本填充为该大小的倍数。 PHP 还不错,我相信 SSL 使用 pkcs7 填充。请注意,即使使用不同的填充方案,对于大多数方案来说,密文的开头应该相同,只是结尾可能是垃圾。

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

关于PHP (mcrypt_encrypt) Ruby (AES-256-CBC) 加密不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10181193/

相关文章:

php - Laravel 中 hasMany 和 ownToMany 之间的关系

php - CakePHP 2.x - 每个项目的虚拟字段最大值

jquery - 如何在 ruby​​ on rails 中发出 ajax 请求?

java - 使用不同的 Cipher 对象解密时出现 BadPaddingException

c - C语言中如何从字符串中获取子字符串?

PHP、HTML、Javascript执行顺序

php - Perl 数组/哈希到 php

arrays - 如何在 Ruby 中为正则表达式字符串匹配生成百分比?

ruby 抽象

c# - 我怎样才能保护熵?