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



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

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

我不熟悉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>

除了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({
    //...
    }
    })();
    

需要注意的几件事:

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

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

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

  • 切勿使用ECB模式。它是确定性的,因此在语义上不安全。你至少应该使用像CBC或CTR这样的随机模式。最好验证您的密文,这样就不可能进行像填充预言机攻击这样的攻击。这可以通过GCM或EAX等身份验证模式来实现,也可以通过先加密后MAC的方案来实现。

最新更新