我正在尝试在 javascript (node.js) 中生成一个加密的数据块,然后通过 HTTP 传递到另一个系统。我在 php 中获得了一个参考系统来比较我的结果。
由于我似乎无法理解的原因,我无法让我的 javascript 版本生成与 PHP 版本相同的加密数据。我已经检查过我使用的密钥是否相同。有没有人有任何线索或提示我做错了什么。
(是的,我知道欧洲央行很糟糕,但这不是我的选择)
参考 PHP 实现
<?php
function getEncrypt($str, $key)
{
$realKey = substr($key, 0, 16);
$padding = pkcs5_pad($str, 16);
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $realKey, $padding, MCRYPT_MODE_ECB));
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
$key = "oi3sgkosQPIdFa0eVSjecIhkha2nAfpn3anAozln0e9rkIGPvzUBgToCtlXLsKyjBITGKozHmn1NArgQodawidiVnyxccsf8ZnUgof4kq0iBCS7wrG1raytauMusRjjb";
$string = '{"pol.start":"11-06-2012 09:00:00","pol.end.after":43200,"lic.cache":"yes","playback":2880,"out.digital":"use","out.analog":"use"}';
$encData = getEncrypt($string, $key);
var_dump($encData);
我的 Javascript 尝试:
var crypto = require('crypto');
var cipherAlgo = 'AES-128-ECB';
var policy = '{"pol.start":"11-06-2012 09:00:00","pol.end.after":43200,"lic.cache":"yes","playback":2880,"out.digital":"use","out.analog":"use"}';
var sharedSecret = 'oi3sgkosQPIdFa0eVSjecIhkha2nAfpn3anAozln0e9rkIGPvzUBgToCtlXLsKyjBITGKozHmn1NArgQodawidiVnyxccsf8ZnUgof4kq0iBCS7wrG1raytauMusRjjb';
var util = require('util');
function encrypt(string, key)
{
var realKey = key.substring(0,16);
var cipher = crypto.createCipher(cipherAlgo, key.substring(0,16));
//encrypt our string
var encrypted = cipher.update(string, 'utf8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
console.log(encrypt(policy, sharedSecret));
我已经尝试了很多事情,比如将输出重新调整为二进制文件、放入缓冲区和 base64ing 等等。
为了我的理智,有人可以帮忙解决这个问题。