【发布时间】:2017-05-31 13:08:55
【问题描述】:
如何在javascript中输出CBC模式下的初始化向量?此处使用 256 位密钥。
var blockSizeInBits = 128;
var keySizeInBits = 256;
function rijndaelEncrypt(plaintext, key, mode) {
var expandedKey, i, aBlock;
var bpb = blockSizeInBits / 8; // bytes per block
var ct; // ciphertext
if (!plaintext || !key)
return;
if (key.length*8 != keySizeInBits)
return;
if (mode == "CBC") {
ct = getRandomBytes(bpb); // get IV
//dump("IV", byteArrayToHex(ct));
} else {
mode = "ECB";
ct = new Array();
}
function encrypt(block, expandedKey) {
var i;
if (!block || block.length*8 != blockSizeInBits)
return;
if (!expandedKey)
return;
block = packBytes(block);
addRoundKey(block, expandedKey);
for (i=1; i<Nr; i++)
Round(block, expandedKey.slice(Nb*i, Nb*(i+1)));
FinalRound(block, expandedKey.slice(Nb*Nr));
return unpackBytes(block);
}
function Encrypt_Text(plaintext, keystr) {
if (keystr.length == 0) {
alert("Please specify a key.");
return "";
}
if (plaintext.length == 0) {
alert("Nothing to encrypt!");
return "";
}
setKey(keystr);
addEntropyTime();
prng = new AESprng(keyFromEntropy());
var v = "";
for(var i=0; i<plaintext.length % 16; i++) //pad with null to blocks of 16bytes
plaintext += '\0';
var ct = rijndaelEncrypt(plaintext, key, "CBC");
var hex_str = byteArrayToHex(ct);
var out_str = "";
hex_str = hex_str.split('');
for(var i=0; i<hex_str.length; i++) {
if(i % 64 == 0 && i > 0) out_str += '\n';
out_str += hex_str[i];
}
delete prng;
return out_str;
}
这里的初始化向量是表示 128 位的密文块还是随机位的明文?
【问题讨论】:
-
如果您只使用对称加密,您需要在服务器和客户端使用完全相同的密钥。如果您将加密密钥从服务器发送到客户端或以其他方式发送,您需要加密您的对称加密密钥。最简单的方法是使用 TLS。如果你使用 TLS,那么数据和密钥都是加密的,所以你不需要自己加密。这不提供任何安全性,只是有点混淆。您应该阅读:nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/…
-
您显示的代码不使用 IV。可能是
rijndaelEncrypt在内部使用它,但这只是猜测,我们不会在 Stack Overflow 上这样做。 -
初始化向量不代表密文或纯文本。正如您的代码所示,它是一个独立的随机字节(ct = getRandomBytes(..))。要了解有关初始化向量的更多信息,请阅读这篇文章:AES Encryption - Key vs IV
标签: javascript encryption aes cbc-mode