密文未转换为纯文本且未收到提醒

时间:2016-06-13 12:10:32

标签: javascript encryption cryptojs

我无法解密密文。我必须测试我的解密是否正常工作。所以,我创建了一个简单的html文件,它接受密文并将其转换为纯文本。

我只是在这里硬编码值,而不是将密文转换成纯文本。

当我尝试它时根本不起作用。我不明白这是什么问题。

这是我的代码

<!DOCTYPE html>
<html>
<head>
    <script src="tripledes.js"></script>
    <script src="mode-ecb.js"></script>
    <style type="text/css">
<script type="text/javascript">

        function decryptByDES(aHJHDJSHJhjsak=, highishjdhsjhjs) {
            var keyHex = CryptoJS.enc.Utf8.parse(highishjdhsjhjs);

            var decrypted = CryptoJS.DES.decrypt({
                ciphertext: CryptoJS.enc.Base64.parse(aHJHDJSHJhjsak=)
            }, keyHex, {
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
            });

            return decrypted.toString(CryptoJS.enc.Utf8);
            alert ( decrypted);
        }


    </script>
</head>
<body>

    <div class="maindiv">
        <div>
            <label for="name">Message:</label>
            <input type="text" id="msg" name="msg" />
        </div>
        <div>
            <label for="mail">Key:</label>
            <input type="text" id="key" name="key" />
        </div>

        <div class="button">
            <button onclick="decryptByDES()">View</button>
        </div>
    </div>
</body>
</html>

我的mode-ecb.js文件是

/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
/**
 * Electronic Codebook block mode.
 */
CryptoJS.mode.ECB = (function () {
    var ECB = CryptoJS.lib.BlockCipherMode.extend();

    ECB.Encryptor = ECB.extend({
        processBlock: function (words, offset) {
            this._cipher.encryptBlock(words, offset);
        }
    });

    ECB.Decryptor = ECB.extend({
        processBlock: function (words, offset) {
            this._cipher.decryptBlock(words, offset);
        }
    });

    return ECB;
}());

我需要在警报中显示我的解密文本。但什么都没发生。

2 个答案:

答案 0 :(得分:1)

我不熟悉CryptoJS,但是......看起来您需要在return decrypted.toString(CryptoJS.enc.Utf8);行之前移动警报,因为一旦函数返回警报就不会被调用。

此外,更好的做法是制作密钥和密文文本变量字符串,然后从传递这些变量的按钮调用它(尽管您可能希望将密钥存储在javascript中,并且只传入cipherTextString)

<script type="text/javascript">
    function decryptByDES(cipherTextString, keyString) {
        var keyHex = CryptoJS.enc.Utf8.parse(keyString);

        var decrypted = CryptoJS.DES.decrypt({
            ciphertext: CryptoJS.enc.Base64.parse(cipherTextString)
        }, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });

        var decryptedStringified = decrypted.toString(CryptoJS.enc.Utf8);

        alert(decryptedStringified);

        return decryptedStringified;
    }
</script>

然后从你的按钮调用它,传入正确的变量:

<button onclick="decryptByDES('aHJHDJSHJhjsak=', 'highishjdhsjhjs');">View</button>

答案 1 :(得分:1)

除了Jem的回答......

如果你想对一个密钥进行硬编码,那么你可以做很多事情,但是所有这些都应该涉及某种代码混淆,因为客户端可能只是打开开发人员工具并读取密钥。

如何对密钥进行硬编码,这里有两种简单的方法可以将密钥泄露给全局对象......

  1. 在执行加密/解密的函数的本地范围

    function decryptByDES(cipherTextString) {
        var keyHex = CryptoJS.enc.Utf8.parse("mykeystring12345");
        var decrypted = CryptoJS.DES.decrypt({
        //...
    }
    
  2. 在包装器范围(此处用于IIFE)中,但不在全局范围内

    (function(){
        var keyHex = CryptoJS.enc.Utf8.parse("mykeystring12345");
        function decryptByDES(cipherTextString) {
            var decrypted = CryptoJS.DES.decrypt({
            //...
        }
    })();
    
  3. 有几点需要注意:

    • 如果您对密钥进行硬编码,那么如果密钥所在的文件传输不安全,则不会提供任何真正的安全性。您肯定需要HTTPS,但如果您有HTTPS,则可能不需要CryptoJS提供的加密。 (Ref

    • DES仅支持一个密钥大小为8 字节。如果你不能提供密钥(它应该看起来像随机噪音),那么你可能提供了一个密码,它不需要具有这个特定的长度要求。由于密码不能用作密钥,因此您需要从该密码派生密钥。 CryptoJS支持PBKDF2。如果你提供的密钥没有所需的大小,那么你会得到奇怪的结果,但不要指望CryptoJS会出错。

    • 现在不要使用DES。它只提供56位安全性。 AES会更好,因为它的最低密钥大小为128位更安全。使用DES的最大密文大小也存在实际限制。请参阅Security comparison of 3DES and AES

    • 绝不使用ECB mode 。它是确定性的,因此在语义上不安全。您应该至少使用CBCCTR等随机模式。最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以使用经过验证的模式(如GCM或EAX)或encrypt-then-MAC方案来完成。