【发布时间】:2015-12-03 09:01:31
【问题描述】:
我使用 JavaScript 加密和 php 解密字符串,反之亦然,但问题是在两个平台上生成的输出是不同的,如果我在两个平台上加密字符串“abc”,它们将产生不同结果虽然我确信我的加密是正确的,因为我正在加密的字符串是用相同的语言解密的。
我知道在这种情况下,key 或 iv 中必须有一些不同的东西,但不知道是什么
加密字符串的Javascript代码
var encrypted = CryptoJS.TripleDES.encrypt("Message", "SecretPassphrase");
console.log(encrypted);console.log(String(encrypted));
var text = "<some plain text goes here>";
var key = "00f74597de203655b1ebf5f410f10eb8";
var useHashing = true;
if (useHashing) {
key = CryptoJS.MD5(key).toString();
key += key.substring(1, 16);
console.log(key);
}
var textWordArray = CryptoJS.enc.Utf16.parse(text);
var keyHex = CryptoJS.enc.Hex.parse(key);
var iv = String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0);
var ivHex = CryptoJS.enc.Hex.parse(iv);
console.log('hexadecimal key: ' + keyHex + '\n');
console.log('iv: ' + iv + '\n');
console.log('hexadecimal iv: ' + ivHex + '\n');
var options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: ivHex
};
var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, keyHex, options);
var base64String = encrypted.toString();
console.log('base64: ' + base64String + '\n');
var decrypted = CryptoJS.TripleDES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(base64String)
}, keyHex, options);
console.log('decrypted: ' + decrypted.toString(CryptoJS.enc.Utf16));
加密字符串的PHP代码
//Generate a key from a hash
$key = md5(utf8_encode("00f74597de203655b1ebf5f410f10eb8"), true);
//Take first 8 bytes of $key and append them to the end of $key.
$key .= substr($key, 0, 8);
//Padding for 3DES
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($value);
$pad = $blockSize - ($len % $blockSize);
$value .= str_repeat(chr($pad), $pad);
//Generating iv for 3DES
$iv = chr(0) . chr(0) . chr(0) . chr(0) . chr(0) . chr(0) . chr(0) . chr(0);
//Encrypt data
$encData = mcrypt_encrypt(MCRYPT_3DES, $key, $value, MCRYPT_MODE_CBC, $iv);
$value = base64_encode($encData);
示例 如果我从javascript加密字符串“admin”,它会给我“U2FsdGVkX1+y/zo1FJEZZ0aqPMQuwilOydbJjzIKpYw="
php 在哪里给我 "AzZFzbnwp2Y="
注意我正在使用 CryptoJSv3 插件进行三重 DES*
【问题讨论】:
-
你现在为什么使用三重DES?使用 AES:Examples
-
这是过去项目的一部分,我不应该改变它:)
-
你不应该改变哪一部分?您能否显示一个示例字符串以便更容易找到匹配的解密?
-
我不应该改变我们使用的加密方式,即 3DES 到 AES
-
但是您可以更改其他所有内容(例如,通过使用随机 IV 添加语义安全性或通过运行 HMAC 添加密文身份验证)?
标签: javascript php encryption cryptojs tripledes