如何在没有IV的情况下在.NET中进行AES加密

时间:2012-04-24 22:57:34

标签: .net asp-classic cryptography rijndael initialization-vector

我们的Classic ASP应用程序的遗留部分使用了一些代码,这些代码应该用Rijndael(AES)加密/解密字符串。此代码在the Internet here(Rijndael AES Block Cipher(VB Version))上找到。我已经在SO上找到了一个引用这个确切库和ask almost the same thing as me的问题,但我怀疑至少有一件事情出错了(除了在bytes数组的开头加上数据的长度加密)。 vbScript实现似乎根本不向要加密的数据添加IV。因此,我无法将相同的加密与RijndaelManaged匹配,因为它:

  1. 每次都会自动生成不同的IV
  2. 绝对需要IV
  3. 有人知道在没有指定IV(空)的情况下AES是否可以在.Net中加密?

3 个答案:

答案 0 :(得分:7)

您使用的代码和问题的解决方案都是完全不安全的。 首先, *您不应该在任何情况下使用CRYPTO图书馆一些随机的GUY WROTE * 期间,故事结束。 Windows和.net都有受信任,经过审查的加密库。他们没有定时攻击问题,正确的后门,或只是没有人知道加密的任何人会尝试的蠢事。

例如,您提到的库似乎只支持ECB mode。这是完全不安全的,没有人知道他们在做什么会做到这一点。尽管有很多原因,但为什么不这样做最好的证明是:

enter image description here

这是linux penguine的ecb加密图片。它不是很安全吗?

答案 1 :(得分:2)

如果没有IV,你不能在CBC模式下加密任何东西。但是,你可以明确地将IV设置为零。由于IV与第一个普通块进行XOR运算,因此将IV设置为全零等效于没有IV。

这只是你问题的答案,你可能想要留意到目前为止给你的所有其他安全建议。您可能还想检查代码是否实际使用需要IV的CBC模式加密。

用于CBC模式加密的IV始终只有一个块(AES为16字节,但只要可用,就使用getBlockSize()方法。

答案 2 :(得分:1)

明确将密码的Mode属性设置为ECB

除非您加密的明文是短的,随机的,唯一的字符串,否则ECB是不安全的。例如,加密会话密钥或其他加密密钥非常有用。