当前位置: 首页 > 知识库问答 >
问题:

PHP和Node.js中的加密结果不同

柳翼
2023-03-14

我正在加密字符串“AAAAAAAAAAAAAAAAAAAAAAAA”(一个16字节的UTF8字符串)使用AES 128 CBC与空白iv和密钥(16 0),并得到不同的结果

在PHP中:

echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,pack("H*", "00000000000000000000000000000000"),"aaaaaaaaaaaaaaaa",MCRYPT_MODE_CBC,pack("H*", "00000000000000000000000000000000")))
let cipher = require('crypto').createCipheriv('aes-128-cbc',Buffer.alloc(16),Buffer.alloc(16))
console.log(cipher.update('aaaaaaaaaaaaaaaa','utf8','base64') + cipher.final('base64'))

第一位(粗体)与PHP相同,但PHP值有一个额外的“a=”,然后节点值有一个额外的“heuidae8z4dk0hu7p2z+1c”

我承认我对这里发生的事情很不确定--我错过了什么?

编辑...但不是那么不稳定,我不明白我在这里做的并不是特别安全。不要担心这是否是加密的“正确”方法--请关注结果应该是一致的这一事实。

节点:926C0FEA05AFD65F5931D29A9C6B3F9C779489D69EF19E1D2B41D4EE9DB3FB57

节点十六进制的第二块是由.final方法返回的,我不明白它是干什么用的。

共有1个答案

赵雅懿
2023-03-14

AES的块大小为16字节。您正在加密字符串“Hello World”,该字符串在UTF8中为11字节长。因此,填充用于将字符串的长度增加到16个字节。

节点,它应该使用PKCS5填充将纯文本填充到16个字节,然后对其进行加密。

mcrypt不应该使用零字节来填充纯文本。mcrypt已被弃用十年。

我的建议是:改用PHP中的openssl_*函数。不要用静态静脉注射。使用静态IV使您的程序容易受到一些与ECB模式相同的漏洞的攻击,这是不好的!

 类似资料:
  • 我工作在AES256能够加密/解密之间的iOS和PHP使用不安全的渠道。 我见过许多类似的问题,围绕着密钥大小、模式(CBC或ECB)、随机iv的使用等。但是在这种情况下,我发现了以下奇怪的行为。 两种环境中的配置:-键:32字节(256位)-块大小:128位(标准)-iv:16字节(用于测试的静态)-模式:CBC 如果我加密一个16或32字节的文本(以匹配AES块大小),Swift和PHP中的结

  • 我有相同的数据和加密密钥,相同的算法,相同的模式,但不同的结果。 C#代码: 结果:13A6DAD3119F29A8C4BF6D5BD11564E4E1A93F85B7F2AD9E8E97756688754DE32A23ADE41DFD9F76186D8E25E66D0DCF458ECAA026F16463811C48FC814E50B10FF57FDDB0C0761088D1AC4DDDAE74

  • 问题内容: PHP功能: Java函数 } 返回null。 请注意,我们不允许更改PHP代码。有人可以帮助我们在Java中获得相同的结果吗?非常感谢。 问题答案: 如果您不只是简单地将例程中的可能内容吞噬掉,那么您将对发生的事情有了更好的了解。如果函数正在返回,那么显然发生了异常,您需要知道它是什么。 实际上,例外是: 可以肯定的是,您的纯文本长度只有11个Java字符,按照您的默认编码,它将为1

  • 我有一个 API,要求我对通过 AES 密码发送给它的数据进行编码。 但是,我得到的唯一示例代码是 Node.js 代码。 我想,用PHP重新实现它有多难? 显然很难。 下面您可以看到这两种方法,但您也可以看到不同的结果。 有人知道哪里出了问题吗? 结果:3522ca23 结果:8faa39d2

  • 我已经尝试使用cipher.getinstance(“rsa/ecb/pkcs1padding”),但没有给出预期的结果。 感谢所有的帮助。祝你有美好的一天。

  • 就像我说的,一切都很好,除了这个小的decypt...我搜索了谷歌和所有的东西,尝试了示例代码,但似乎我的代码有些东西不对。