js 文本加密 php解密,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值