php-mcrypt到javascript aes的集成
php mcrypt to javascript aes integration
我正试图使用javascript对数据进行编码,并使用AES-256-CBC和php-mcrypt库进行解码,反之亦然。
我知道javascript的问题性质,以及任何人都能看到关键的事实,但我正在使用javascript作为非web环境的脚本工具,所以不必担心。
我找到了pidderhttps://sourceforge.net/projects/pidcrypt/
并用演示页面加密了一些数据,然后试图通过php解密,但出现了问题,我似乎找不到什么。。。我使用的是两端相同的密钥,一个32字节的字符串
任何指针都将受到的赞赏
~~~
$encrypted = "string after pidder encryption";
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256,'',MCRYPT_MODE_CBC,'');
$iv_size = mcrypt_enc_get_iv_size($cipher);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
mcrypt_generic_init($cipher, $key, $iv);
$encrypted = base64_decode($encrypted);
echo "after b64decode: " . $encrypted . "'n'n'n";
$encrypted = mdecrypt_generic($cipher, $encrypted);
echo "decrypt:" . $encrypted;
~~~
尝试使用AES-256的32字节密钥的MCRYPT_RIJNDAEL_128。
AES是一种128位分组密码,支持128位、192位和256位密钥。Rijndael-256是一个256位分组密码和AES。AES是Rijndael的128位块规范。
Pidder使用密钥派生函数从密码中获取密钥(我想应该是HMAC-SHA1),但您似乎使用普通密码作为密钥。
Javascript Mcrypt与PHP Mcrypt配合良好。你可以用它代替pidder。
老实说,你的代码是顺序的,我没有试图修复,但我有一个功能可以很好地工作,可以帮助你。
/**
* Encrypt Token
*
* @param unknown $text
*/
private function rijndaelEncrypt($text) {
$iv_size = mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB );
$iv = mcrypt_create_iv ( $iv_size, MCRYPT_RAND );
$key = 'your key';
return base64_encode ( mcrypt_encrypt ( MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv ) );
}
/**
* Decrypt
*
* @param unknown $text
*/
private function rijndaelDecrypt($text) {
$iv_size = mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB );
$iv = mcrypt_create_iv ( $iv_size, MCRYPT_RAND );
$key = 'your key';
// I used trim to remove trailing spaces
return trim ( mcrypt_decrypt ( MCRYPT_RIJNDAEL_256, $key, base64_decode ( $text ), MCRYPT_MODE_ECB, $iv ) );
}
请参阅http://us3.php.net/manual/en/function.mcrypt-encrypt.php
首先:MCRYPT_RIJNDAEL_256不是(。
这将是php部分:
function decrypt($data, $key) {
if(32 !== strlen($key)) $key= hash('SHA256', $key, true);
$data = base64_decode($data);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("'0", 16));
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
这个php函数包括填充,这是一个重要的部分,因为如果被覆盖的数据长度不是键的倍数,你会得到一些奇怪的东西。
为了解码,我们使用了我的一些Node.js脚本,并为iv:模拟了php的str_repeat方法
var crypto = require('crypto');
function encrypt(data, key) {
key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'),
cipher = crypto.createCipheriv('aes-256-cbc', key.toString('binary'), str_repeat(''0', 16));
cipher.update(data.toString(), 'utf8', 'base64');
return cipher.final('base64');
}
function str_repeat(input, multiplier) {
var y = '';
while (true) {
if (multiplier & 1) {
y += input;
}
multiplier >>= 1;
if (multiplier) {
input += input;
} else {
break;
}
}
return y;
}
注意:不建议使用静态IV(初始化矢量)!注意:JavaScript部分用于Node.js,使用它的加密库。
我希望这对你有用。
- 如何检测用于WebGL的专用或集成显卡
- 在我的SPA应用程序中集成Facebook共享的问题
- vaadin:使用自定义布局集成angular js
- React ajax数据集成
- 有没有一个抽象层,这样我就可以集成一次,然后使用pusher、pubnub或faye
- IE中关于ZK和JavaScript集成的一些错误
- 如何将拼写检查集成到密文编辑器
- 将外部文件与AngularJs集成
- 如何将tesseract OCR与Cordova/Phonegap应用程序集成
- 如何正确使用AES加密
- Cordova Facebook登录集成cordovaOauth
- 如何在Angular js中集成其他页面中的样式
- 正确使用AES-CTR模式的随机数和计数器
- 性能与模块化:将JS集成到PHP或单独的custom.JS中
- Meteor集成测试,在velocity'她的镜子上有茉莉花
- Okta与JavaScript的集成
- 将prettyPhoto集成到Wordpress主题中
- 将epub.js集成到firefox中,作为.epub的默认读取器
- 在Meteor:p5.AudioIn()中集成p5.sound.js不是构造函数
- php-mcrypt到javascript aes的集成