【发布时间】:2021-10-23 05:42:54
【问题描述】:
我有一个旧版 php 代码,它使用 TripleDES 方法加密,作为银行流程的一部分,以加密购买操作。这是代码:
/****** 3DES Function ******/
function encrypt_3DES($message, $key){
$l = ceil(strlen($message) / 8) * 8;
return substr(openssl_encrypt($message . str_repeat("\0", $l - strlen($message)), 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, "\0\0\0\0\0\0\0\0"), 0, $l);
}
我想使用 CriptoJS 的 TripleDES 在javascript 中重现相同的代码。这是我目前的试验:
<script src=https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/tripledes.js></script>
<script>
function encrypt_3DES(message, key) {
// Parse input parameters
message = CryptoJS.enc.Utf8.parse(message);
key = CryptoJS.enc.Utf8.parse(key);
// Build an iv with zero values
let iv = CryptoJS.lib.WordArray.create(64/8);
let encrypted = CryptoJS.TripleDES.encrypt(message, key, {iv: iv});
// Encrypt with TripleDES
return encrypted.toString();
}
let message = "testMessage";
let key = "testKey";
let encrypted = encrypt_3DES(message, key);
// encrypted: "HLu4p18KtFfy5VjwjFkDHA=="
</script>
以示例值为例,结果是字符串"HLu4p18KtFfy5VjwjFkDHA=="。
问题是js和php之间的结果略有不同,我的怀疑指向在php端完成的substr操作,因为当我转换@987654330的结果时@ 操作(没有子字符串),我的 javascript 代码返回相同的 base64 字符串:
<?php
/****** 3DES Function ******/
function encrypt_3DES($message, $key)
{
$l = ceil(strlen($message) / 8) * 8;
return substr(openssl_encrypt($message . str_repeat("\0", $l - strlen($message)), 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, "\0\0\0\0\0\0\0\0"), 0, $l);
}
$message = "testMessage";
$key = "testKey";
$res = base64_encode(encrypt_3DES($message, $key));
$res2 = base64_encode(openssl_encrypt($message, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, "\0\0\0\0\0\0\0\0"));
/* $res: HLu4p18KtFfTr47KvI/WEw== (My goal is to get this in javascript) */
/* $res2: HLu4p18KtFfy5VjwjFkDHA== (without the substr operation, the results match) */
?>
所以,我的问题是:有没有办法将相同的子字符串应用于 javascript 的 CryptoJS 操作的加密结果?
【问题讨论】:
标签: javascript php cryptojs tripledes