我无法解密密文。我必须测试我的解密是否正常工作。所以,我创建了一个简单的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;
}());
我需要在警报中显示我的解密文本。但什么都没发生。
答案 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的回答......
如果你想对一个密钥进行硬编码,那么你可以做很多事情,但是所有这些都应该涉及某种代码混淆,因为客户端可能只是打开开发人员工具并读取密钥。
如何对密钥进行硬编码,这里有两种简单的方法可以将密钥泄露给全局对象......
在执行加密/解密的函数的本地范围
function decryptByDES(cipherTextString) {
var keyHex = CryptoJS.enc.Utf8.parse("mykeystring12345");
var decrypted = CryptoJS.DES.decrypt({
//...
}
在包装器范围(此处用于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 。它是确定性的,因此在语义上不安全。您应该至少使用CBC或CTR等随机模式。最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以使用经过验证的模式(如GCM或EAX)或encrypt-then-MAC方案来完成。