密文未转换为纯文本且未收到警报
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>
除了杰姆的回答...
如果你想硬编码一个密钥,那么你可以做很多事情,但所有这些都应该涉及某种代码混淆,因为客户端可能只是打开开发者工具并读取密钥。
硬编码密钥的方法,这里有两种简单的方法不会将密钥泄露给全局对象...
在执行 encryption/decryption
的函数的局部范围内
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. 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 方案。
我无法解密密文。我必须测试我的解密是否正常工作。因此,我创建了一个简单的 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>
除了杰姆的回答...
如果你想硬编码一个密钥,那么你可以做很多事情,但所有这些都应该涉及某种代码混淆,因为客户端可能只是打开开发者工具并读取密钥。
硬编码密钥的方法,这里有两种简单的方法不会将密钥泄露给全局对象...
在执行 encryption/decryption
的函数的局部范围内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. 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 方案。