gpt4 book ai didi

Javascript AES 加密返回太多字符

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:32 26 4
gpt4 key购买 nike

我正在尝试将 PHP 加密脚本实现为 JavaScript。我的 PHP 脚本返回 128 个字符的字符串,而我的基于 Javascript 的脚本返回 160 个字符。基于 JavaScript 的版本的前 128 个字符与基于 PHP 的版本匹配。

function pkcs5_pad ($text, $blocksize){
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
$skey = "somekey";
$ivKey = "someIVKey";
$input = "empid=xxxxxx;timestamp=Sat, 19 Nov 2016 00:33:03 UTC";

try {
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128,'cbc');
echo strlen($input) . "\n";
$input = pkcs5_pad($input, $size);
echo strlen($input) . "\n";
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

$key = pack('H*', $skey);
$iv = pack('H*', $ivKey);
# The key size used is 16, 24 or 32 bytes - for AES-128, 192 and 256 respectively

if (mcrypt_generic_init($cipher, $key, $iv) != -1){
$encrypted = mcrypt_generic($cipher, $input);
mcrypt_generic_deinit($cipher);
$encryptedString = bin2hex($encrypted);
}
echo $encryptedString . "\n";
echo strlen($encryptedString) . "\n";
} catch (Exception $ex) {
echo $ex->getMessage();
}

这里的长度 strlen($encryptedString) 给出了 128 个字符。

我的基于 JavaScript 的版本使用 CryptoJS 创建如下所示的内容

var aesKey = "somekey";
var ivKey = "someIVKey";

function pkcs5_pad (text, blocksize){
console.log(text.length);
var pad = blocksize - (text.length % blocksize);
console.log("pad:" + pad);
return text + str_repeat(chr(pad), pad);
}

input = "empid=xxxxxx;timestamp=Sat, 19 Nov 2016 00:33:03 UTC";

var size = 16;
console.log(input.length);
var input = pkcs5_pad(input, size);
console.log('"' + input + '"');
console.log(input.length);

var key = CryptoJS.enc.Hex.parse(aesKey);
var iv = CryptoJS.enc.Hex.parse(aesIV);

var encryptedString = CryptoJS.AES.encrypt(input,key,{iv: iv});
console.log(encryptedString.ciphertext.toString().length);
encryptedString = encryptedString.ciphertext.toString();

一切都匹配,包括 pkcs5_pad 之前和之后的字符串长度。我使用 locutus.io 中的一些附加 JavaScript 代码来调用 str_repeat 和 chr。这里 encryptedString.ciphertext.toString().length 返回 160 个字符,前 128 个字符与我的 PHP 脚本匹配。

我的理解是 CryptoJS 版本 3 使用 CBC 模式,但我也将模式显式设置为 CBC 但无济于事。我还以十六进制形式返回了加密字符串

encryptedString = encryptedString.ciphertext.toString(CryptoJS.enc.Hex);

我哪里出错了?

编辑PHP版本的输出是

86b1c9874069129d0852eade01eb753a176a1c6155c4af3ac447ae0a5350b92c3447f95be9c4f8cdbf14503696bcaa16e6307c1605a2cac503239db9d1ac6fb3

JavaScript版本的输出是

86b1c9874069129d0852eade01eb753a176a1c6155c4af3ac447ae0a5350b92c3447f95be9c4f8cdbf14503696bcaa16e6307c1605a2cac503239db9d1ac6fb3305 1208849788f8a90db1cbe2494cac7

最佳答案

额外的 32 个字符是 16 字节的十六进制编码,即填充。 Java 正在添加填充,而 PHP 则没有。

请注意,mcrypt 不使用标准 PKCS#7(née PKCS#5)填充。

好的加密库将有一个填充选项,并在加密时添加填充并在解密时将其删除。您不必自己进行填充。

关于Javascript AES 加密返回太多字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40688305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com