首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用crypto-js解密AES ECB

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

Stack Overflow用户
提问于 2013-01-15 05:35:12
回答 3查看 22.5K关注 0票数 5

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

有几个javascript Aes库,但它们实际上都没有文档。我正在尝试使用crypto-js,但是不能让代码工作。下面的示例生成一个空输出,它应该生成"6bc1bee22e409f96e93d7e117393172a“。

代码语言:javascript
复制
<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获取了一个记录在案的工作密钥和加密数据

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

有没有人知道为什么上面的代码无法解密数据,或者知道文档在哪里?

更新:经过几个小时的试验和错误,我想出了一个组合,它产生了输出: 7c121d95a84573b6120ada2ffff1ce3118561eba40555c0b然而,这仍然是不正确的。为实现这一点所做的更改如下:

代码语言:javascript
复制
 var decrypted3 = CryptoJS.AES.decrypt('3ad77bb40d7a3660a89ecaf32466ef97', key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });

也就是说,我将数据作为十六进制字符串传入,这不可能是正确的,但至少会产生输出。

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

代码语言:javascript
复制
Pkcs7 (the default)
Iso97971
AnsiX923
Iso10126
ZeroPadding
NoPadding 

这是否意味着没有机会在两个库之间解密所有数据?以前我不得不编写自己的填充hack(在AS3和java之间)来添加或删除尾随数据,但这花了几天的时间来处理二进制数据--必须有一种更简单的方法将单个加密字符串从客户端发送到服务器。

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

EN

回答 3

Stack Overflow用户

发布于 2013-11-24 09:40:51

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

代码语言:javascript
复制
<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可以使用标准格式进行字符串化,这就是它与其他系统通信的方式。

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

票数 9
EN

Stack Overflow用户

发布于 2013-01-15 08:45:50

放弃了ECB,尝试了CBC的各种排列,并得到了一个工作。将IV以纯文本形式从客户端发送到服务器似乎也是可以的。

下面是正确输出"6bc1bee22e409f96e93d7e117393172a“的版本。令人震惊。

代码语言:javascript
复制
<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-cbc.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 iv = CryptoJS.enc.Hex.parse('000102030405060708090A0B0C0D0E0F');
    var data = CryptoJS.enc.Hex.parse('7649abac8119b246cee98e9b12e9197d');      

    var encrypted = {};
    encrypted.key=key;
    encrypted.iv=iv;
    encrypted.ciphertext = data;

    var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

    document.write("<br /> dec3: " + CryptoJS.enc.Hex.stringify(decrypted));
</script>
</body>
</html>
票数 4
EN

Stack Overflow用户

发布于 2016-11-21 20:10:39

这是一个有效和更新的答案,具有更新的CDN链接和将结果解密数据转换为明文的功能。

代码语言:javascript
复制
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    </head>
    <body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"></script>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"></script>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/mode-ecb.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"></script>


    <script>
    var encrypted = 'B655564D4428C56E7F9E44D81770CFDBC3FB0FCEA8FFDF7CC936FFE6C7A595A0FE085FAA65796C4C24D0862FAF56CAA1880DCD281A891DD1E999F953F2B669291B41B486E0FEC5E11BE7B7348703665081E4FF79F815C35803506468548F3C5EE13B5783A0E22D91E08CB1897E4D135DA8C4E650A1D51FFDDD210311A0835FD8E8EE08CC968F8A0B0EF811554872A093',
    key = CryptoJS.enc.Hex.parse('844AF9144552AFAE26A9C45FD5882718'),
    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 />" + hex2a(CryptoJS.enc.Hex.stringify(decrypted3)));
    function hex2a(hexx) {
    var hex = hexx.toString();//force conversion
    var str = '';
    for (var i = 0; i < hex.length; i += 2)
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    return str;
}
</script>
</body>
</html>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14327136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档