【问题标题】:how to output the initialization vector here in this code?如何在这段代码中输出初始化向量?
【发布时间】: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


【解决方案1】:

一种通用的 IV 解决方案是在加密数据前加上 IV,它不需要保密。解密时,IV 可以从加密数据中分离出来并用于解密 IV。

注意事项:

  1. 最好不要使用空填充,而是使用PKCS#7 padding。这通常是大多数实现的选项,在许多情况下是默认选项。

  2. 最好不要直接使用文本密码,而是使用PBKDF2等方法从文本中导出密码。可以指定 PBKDF2 的输出产生足够的字节来拆分密钥和 IV。

  3. ECB模式,不安全,见ECB mode,向下滚动到企鹅号。

【讨论】:

  • IV 通常是块大小的随机字节。它确保使用相同密钥加密的相同消息将导致不同的加密数据。但也许我不明白评论问题。
  • 表示输入文本的随机字节数?
  • 不,只是随机字节。
  • etherhack.co.uk/symmetric/aes/aes.html 这是完整的代码...这里的 IV 不是手动输入的。
  • 引用代码中的语句存在问题:“AES 是行业认可的 Rijndael 加密算法版本,在 CBC 模式下使用 256 位密钥。”这是不正确的,AES 是 Rijndael 的一个版本,块大小为 128 位,密钥长度为 128、192 或 256 位。
猜你喜欢
  • 2015-06-04
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多