密文未转换为纯文本且未收到警报

Ciphertext is not converting to plain text and is not being alerted

我无法解密密文。我必须测试我的解密是否正常工作。因此,我创建了一个简单的 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>

我的模式-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;
}());

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

我不熟悉 CryptoJS,但是...看起来您需要将警报移到 return decrypted.toString(CryptoJS.enc.Utf8); 行之前,因为一旦函数 [=20= 就不会调用警报].

此外,最好是制作密钥和密文变量字符串,然后通过传入这些变量的按钮调用它(尽管您可能希望将密钥存储在 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. 在执行 encryption/decryption

    的函数的局部范围内
    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({
            //...
        }
    })();
    

注意几点:

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

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

  • 现在不用DES了。它只提供56位的安全性。 AES 会好得多,因为它使用 128 位的最小密钥大小更安全。 DES 的最大密文大小也有实际限制。见 Security comparison of 3DES and AES.

  • 切勿使用 ECB mode. It's deterministic and therefore not semantically secure. You should at the very least use a randomized mode like CBC or CTR. It is better to authenticate your ciphertexts so that attacks like a padding oracle attack are not possible. This can be done with authenticated modes like GCM or EAX, or with an encrypt-then-MAC 方案。