Javascript 如何在这段代码中输出初始化向量?
如何在javascript中以CBC模式输出初始化向量?这里使用256位密钥Javascript 如何在这段代码中输出初始化向量?,javascript,encryption,aes,cbc-mode,Javascript,Encryption,Aes,Cbc Mode,如何在javascript中以CBC模式输出初始化向量?这里使用256位密钥 var blockSizeInBits = 128; var keySizeInBits = 256; function rijndaelEncrypt(plaintext, key, mode) { var expandedKey, i, aBlock; var bpb = blockSizeInBits / 8; // bytes per
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;
}
var blockSizeInBits=128;
var keySizeInBits=256;
函数rijndaelEncrypt(纯文本、密钥、模式){
变量expandedKey,i,aBlock;
var bpb=blockSizeInBits/8;//每个块的字节数
var ct;//密文
如果(!明文| |!键)
返回;
if(键长*8!=keySizeInBits)
返回;
如果(模式==“CBC”){
ct=getRandomBytes(bpb);//获取IV
//倾倒区(“IV”,byteArrayToHex(ct));
}否则{
mode=“ECB”;
ct=新数组();
}
函数加密(块、扩展密钥){
var i;
如果(!block | | block.length*8!=blockSizeInBits)
返回;
如果(!expandedKey)
返回;
块=包字节(块);
addRoundKey(块,扩展键);
对于(i=1;i一个通用的IV解决方案是在加密数据前面加上IV,它不需要保密。解密时,IV可以从加密数据中分离出来,并用于解密IV
注:
最好不要使用空填充,而是使用。这通常是大多数实现的选项,在许多情况下是默认选项
最好不要直接使用文本密码,而是使用以下方法从文本中派生密码。可以指定PBKDF2的输出,以生成足够的字节来拆分密钥和IV
ECB模式,它不安全,请参阅,向下滚动到企鹅
IV通常是块大小的随机字节。它确保使用相同密钥加密的相同消息将导致不同的加密数据。但可能我不理解注释问题。是指输入文本的随机字节吗?不,只是随机字节。这是完整的代码…此处IV不是手动输入的。st存在问题参考代码中的注释:“AES是业界认可的Rijndael加密算法版本,在CBC模式下使用256位密钥。”这是不正确的,AES是Rijndael的一个版本,块大小为128位,密钥长度为128、192或256位。如果您仅使用对称加密,则服务器和客户端需要完全相同的密钥。如果您将加密密钥从服务器发送到客户端,或者以其他方式发送,则需要加密对称加密密钥。最简单的方法是使用TLS。如果使用TLS,那么数据和密钥都是加密的,因此您不需要自己加密。这不提供任何安全性,只是有一点模糊。您应该阅读:您显示的代码不使用IV。可能是rijndaelEncrypt
在内部使用它,b但这可能是猜测,我们在堆栈溢出上不这样做。初始化向量不表示密文或纯文本。它是一个独立的随机字节位,正如您的代码所示(ct=getRandomBytes(..)。要了解有关初始化向量的更多信息,请通读以下文章: