【发布时间】:2018-02-23 19:10:55
【问题描述】:
我收到来自外部方的加密消息。他们使用 php 和 mcrypt 进行加密,配置如下
- 算法:rijndael-256
- 模式:ecb
- 示例加密消息:
"a364cb3bb55c2788b25f04ef6867d770771a7d0fdd44462b40233ea76a8bd00d"。它的原始消息是"thank you"
下图显示配置
就我而言,我正在使用 nodejs 进行解密。我有一个带有node-mcrypt binding 的工作版本。但我想避免使用原生模块,所以我正在寻找一个纯 JavaScript 解决方案。
我尝试了节点的crypto,但它的aes-256-ecb 产生不同的(不可读的)输出
nodejs 中 MCrypt 绑定的工作代码:
const decryptAES256 = (encrypted: string, password: string): string => {
try {
const desEcb = new MCrypt('rijndael-256', 'ecb');
desEcb.open(md5(password));
const ciphertext = desEcb.decrypt(new Buffer(encrypted, 'hex'));
const plain = ciphertext.toString();
const isUTF8 = plain.split('').every(c => c.charCodeAt(0) <= 256);
if (!isUTF8) {
throw new Error('Invalid Input');
}
const unpadding = plain
.split('')
.filter(c => c.charCodeAt(0))
.join('');
return unpadding;
} catch (ex) {
console.error('Invalid token');
}
};
【问题讨论】:
-
理想情况下,不要使用 mcrypt,任何版本或绑定到它。但是你的问题在细节和代码上仍然很短,看看How to Ask
-
当您声明“rijndael-256”时,可能会指定不是 AES 的 256 位块大小。 AES 有一个块大小:128 位,但是代码在哪里?
-
不要在新作品中使用 ECB 模式并尽快更新旧作品,它不安全,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需在加密数据前加上IV用于解密即可,它不需要保密。
标签: php node.js encryption mcrypt