首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PHP mcrypt加密和使用node crypto解密

如何使用PHP mcrypt加密和使用node crypto解密
EN

Stack Overflow用户
提问于 2013-08-12 04:49:38
回答 2查看 2.5K关注 0票数 0

我有一些生成密文的PHP代码,如下所示:

代码语言:javascript
复制
<?php
$data = '12345678123456781234567812345678123456781234567812345678123456781234567812345678';

$ciphertext = mcrypt_encrypt('rijndael-128', 'M02cnQ51Ji97vwT4', $data, 'ecb');

echo base64_encode($ciphertext);
?>

产生:

代码语言:javascript
复制
6tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Tq0nruhoXVfXZf8UThqEt06tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Q=

我知道ECB不是用于这种类型数据的最佳模式,但我不是加密它的人。

我遇到的问题是node-crypto试图解密它。我的节点脚本如下:

代码语言:javascript
复制
var crypto = require("crypto");    

var data = "6tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Tq0nruhoXVfXZf8UThqEt06tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Q=";

var out = '';

var decipher = crypto.createDecipher("aes-256-ecb", "M02cnQ51Ji97vwT4");

decipher.setAutoPadding(false); //this needs to be set otherwise i get an error:06065064:bad decrypt

out += decipher.update(data, "base64", "ascii");

out += decipher.final("ascii");

console.log(out);

产生:

代码语言:javascript
复制
"3i<1pzV7A

      vnE"3i<1pzV7A

                   vnE"3i<1pzV7A

                                vnE"3i<1pzV7A

                                             vnE"3i<1pzV7A

                                                          vnE

我不知道这里出了什么问题,原始数据的重复模式恢复了,但它是不正确的。我很难在openssl中找到等效的"rijndael-128“,似乎它必须是”aes-256- ECB“,并且不需要IV,因为它是ECB。如何让这两个库协同工作?

谢谢,J

EN

回答 2

Stack Overflow用户

发布于 2013-09-24 01:33:21

https://github.com/tugrul/node-mcrypt

代码语言:javascript
复制
var mcrypt = require('mcrypt');

var bfEcb = new mcrypt.MCrypt('rijndael-128', 'ecb');
bfEcb.open('M02cnQ51Ji97vwT4');

var ciphertext = new Buffer('6tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Tq0nruhoXVfXZf8UThqEt06tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Q=', 'base64');
var plaintext = bfEcb.decrypt(ciphertext);
console.log(plaintext.toString());
票数 1
EN

Stack Overflow用户

发布于 2013-11-05 19:16:44

试试这个:

代码语言:javascript
复制
var crypto = require("crypto");    
var data = "6tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Tq0nruhoXVfXZf8UThqEt06tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Q=";

var out = '';

var decipher = crypto.createDecipheriv("aes-256-ecb", "M02cnQ51Ji97vwT4", '');
out += decipher.update(data, "base64");
out += decipher.final();

console.log(out);

更改createDecipher(...)在我的例子中,使用第三个空参数(即所谓的初始化向量)执行createDecipheriv (注意末尾的iv )。在本例中,删除setAutoPadding(false)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18176536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档