Javascript“Fritz Schneider的Rijndael参考实现”与.NET之间的互操作

时间:2011-08-20 23:50:18

标签: c# javascript cryptography aes rijndael

我正在使用javascript Fritz Schneider的Rijndael参考实现。我想用C#解密结果。

Javascript Rijndael函数中提供的输入变量是

function rijndaelEncrypt(plaintext, key, mode) {}

其中明文是要加密的文本,key是加密密钥,mode选择ECB或CBC。我们使用的模式是ECB。

现在,对于Microsoft Rijndael实现,我应该使用什么来初始化向量来解密它?

为了记录,整个javascript加密就像这样。

function rijndaelEncrypt(plaintext, key, mode) {
  var 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
  else {
    mode = "ECB";
    ct = new Array();
  }

  // convert plaintext to byte array and pad with zeros if necessary. 
  plaintext = formatPlaintext(plaintext);

  var expandedKey = new keyExpansion(key);

  for (var block=0; block<plaintext.length / bpb; block++) {
    aBlock = plaintext.slice(block*bpb, (block+1)*bpb);
    if (mode == "CBC")
      for (var i=0; i<bpb; i++) 
        aBlock[i] ^= ct[block*bpb + i];
    ct = ct.concat(AESencrypt(aBlock, expandedKey));
  }

  return ct;
}

感谢。非常感谢。

1 个答案:

答案 0 :(得分:1)

首先,ECB模式没有初始化向量。我认为你可以将null,一个空数组或一个由0填充的数组传递给你的RijndaelManaged对象。

对于此处的CBC模式实现,初始化向量是密文数组的第一个128位块。

 if (mode == "CBC")
    ct = getRandomBytes(bpb);             // get IV

这些在加密时填充了随机字节,并在解密时从这里读取。

我不确定RijndaelManaged是否会为您输出初始化向量,只需查看输出大小即可。如果没有,请自行添加。