Javascript 如何在这段代码中输出初始化向量?

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

如何在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;
}
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(..)。要了解有关初始化向量的更多信息,请通读以下文章: