gpt4 book ai didi

javascript - 如何使用 crypto-js 解密 AES ECB

转载 作者:搜寻专家 更新时间:2023-11-01 04:57:50 24 4
gpt4 key购买 nike

我正在尝试将加密数据从 flash(客户端)发送到服务器端的 javascript(在 asp 中作为 jscript 运行)。

有几个 javascript Aes 库,但它们几乎没有记录。我正在尝试使用 crypto-js,但无法使代码正常工作。下面的示例生成一个空输出,它应该生成“6bc1bee22e409f96e93d7e117393172a”。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/mode-ecb.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js"></script>
<script>
var key = CryptoJS.enc.Hex.parse('2b7e151628aed2a6abf7158809cf4f3c');
var data = CryptoJS.enc.Hex.parse('3ad77bb40d7a3660a89ecaf32466ef97');
var decrypted3 = CryptoJS.AES.decrypt(data, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });
document.write("<br /> dec3: " + decrypted3.toString());
</script>
</body>
</html>

我从 http://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors 中获取了记录的工作 key 和加密数据

我正在使用 ECB,因为它是唯一不需要 IV 或盐的版本,因为服务器不知道客户端使用的 IV 或盐,因此无法解密数据。

有没有人知道为什么上述无法解密数据,或者知道任何文档在哪里?

更新:经过几个小时的反复试验,我想出了一个产生输出的组合:7c121d95a84573b6120ada2ffff1ce3118561eba40555c0b 然而,这仍然是不正确的。为产生这个所做的改变是:

 var decrypted3 = CryptoJS.AES.decrypt('3ad77bb40d7a3660a89ecaf32466ef97', key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });

即我将数据作为十六进制字符串传递,这可能不正确,但至少会产生输出。

下一个问题是填充问题。在客户端上,我使用的是 AS3 hurlant 库,它只提供两种填充策略:NONE 和 PKCS#5。在 crypto-js 中,可用的策略是:

Pkcs7 (the default)
Iso97971
AnsiX923
Iso10126
ZeroPadding
NoPadding

这是否意味着两个库之间没有机会每次解密数据?在我不得不编写自己的填充技巧(在 AS3 和 java 之间)以添加或删除尾随数据之前,但这需要数天的二进制数据反复试验 - 必须有一种更简单的方法从客户端发送单个加密字符串到服务器。

SSL 不是一个选项,因为客户端用户可以简单地使用 Charles 代理或类似工具来查看和篡改未加密的数据。

最佳答案

以下示例使用 AES 和 ECB 返回所需的输出。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/mode-ecb.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js"></script>


<script>
var encrypted = '3ad77bb40d7a3660a89ecaf32466ef97',
key = CryptoJS.enc.Hex.parse('2b7e151628aed2a6abf7158809cf4f3c'),
cipherParams = CryptoJS.lib.CipherParams.create({
ciphertext: CryptoJS.enc.Hex.parse(encrypted)
});

var decrypted3 = CryptoJS.AES.decrypt(cipherParams, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });
document.write("<br /> dec3: " + CryptoJS.enc.Hex.stringify(decrypted3));
</script>
</body>
</html>

唯一真正的区别是使用 CryptoJS.lib.CipherParams.create() 创建一个 cypherParams 对象。据官方docs一个 cypherParams 对象“让您可以访问加密期间使用的所有参数”,包括 key 、iv、salt 和原始 cypherText。基本上解密它所需的所有信息。在我们的例子中,我们需要将加密数据转换为仅具有 cypherText 属性的 cypherParam。顺便说一下,cypherParam 可以使用标准格式进行字符串化,这就是它与其他系统通信的方式。

关于填充,正如我understand它 Pkcs7 是 Pkcs5 的扩展,应该适用于使用 Pkcs5 创建的任何密码。当我在没有 NoPadding 选项(默认为 Pkcs7)的情况下尝试上面的代码示例时,它不起作用,但我不知道在创建加密数据时使用了什么。至少您链接到的 AES 测试向量页面没有告诉我们。

关于javascript - 如何使用 crypto-js 解密 AES ECB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327136/

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