Node.js:如何解密php中加密的文本?
作者:互联网
我的PHP密码如下所示:
<?
$salt = '…';
$data = '…';
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
$ciphered = trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $data, MCRYPT_MODE_ECB,$iv)));
我试图破译上面的代码的结果:
ciphered = '…';
crypto = require('crypto');
salt = crypto.createHash('md5').update('…').digest('hex');
iv = '0123456789123455';
decipher = crypto.createDecipheriv('aes-256-cbc', salt, iv);
deciphered = decipher.update(ciphered, 'base64');
deciphered += decipher.final('utf-8');
此代码导致:TypeError:DecipherFinal失败
解决方法:
我看到几个问题:
>操作模式不匹配.您在实际加密时为CFB(Cipher Feedback)操作模式生成IV,将ECB(Electronic Code Book-不推荐,请查看该Wiki文章中的图像以了解原因)作为您的模式,然后尝试使用CBC(Cipher Block Chaining)解密)模式.您应该坚持一种模式(可能是CBC).为此,请保留解密端aes-256-cbc并使加密端MCRYPT_MODE_CBC
>您将$salt(实际上是您的密钥)传递给mcrypt_encrypt而不对其进行散列,但对其进行散列,并在crypto.createDecipheriv要求每个its documentation二进制编码的字符串时返回一个十六进制字符串.两个密钥必须相同,并且需要遵循正确的编码,以便在传递给函数时它们保持不变.
>看起来您在加密侧生成了IV,然后在解密侧为IV使用了固定的字符串. IV(初始化向量)需要与密文一起传送到解密侧(并且可以与密文一起清晰地传输).
>根据its documentation,解密对象上的update方法不接受base64编码.您将需要将base64文本转换为其他内容(可能是二进制编码),然后以正确的编码将其传递到update方法中.
> PHP的默认字符集是ISO-8859-1,但是您试图将密文解密为UTF-8字符串.这可能会导致问题,尤其是如果您使用的字符超出了标准ASCII中使用的字符范围.您要么需要确保PHP端在UTF-8模式下运行(有关如何执行操作,请参见this SO answer),要么确保您的输入仅使用ASCII字符(ISO-8859-1是ASCII的超集),并且使用“ ascii”输出编码.
您的大多数问题都归结为编码问题.我对node.js上的各种编码类型了解不多,因此您需要自己研究,但是密码基元的问题应该很容易解决.请确保阅读我链接的文档以及mcrypt_encrypt documentation.
标签:mcrypt,node-js,openssl,cryptography,php 来源: https://codeday.me/bug/20191031/1974922.html