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

问题描述 投票:0回答:4

我们的经典 ASP 应用程序有一个遗留部分,它使用一些应该使用 Rijndael (AES) 加密/解密字符串的代码。此代码可在互联网此处(Rijndael AES 块密码(VB 版本))上找到。我已经在 SO 上发现了一个问题,它引用了这个确切的库,并且它询问与我几乎相同的事情,但我怀疑至少有一件事出了问题(除了在开头添加要加密的数据的长度)字节数组)。 vbScript 实现看起来根本不像向要加密的数据添加 IV。因此,我无法将相同的加密与 RijndaelManaged 相匹配,因为它:

  1. 每次自动生成不同的IV
  2. 绝对需要静脉注射

有人知道是否可以在不指定 IV(空)的情况下对 .Net 中的某些内容进行 AES 加密?

.net asp-classic cryptography rijndael initialization-vector
4个回答
6
投票

您使用的代码和问题的解决方案都是完全不安全的。 首先,*在任何情况下都不应该使用某个随机的人写的加密库* 故事结束了。 Windows 和 .net 都有受信任的、经过审查的加密库。他们没有诸如定时攻击问题、正确的后门之类的问题,或者只是任何对加密一无所知的人都会尝试的愚蠢的事情。

举个例子,您提到的库似乎只支持ECB模式。这是完全不安全的,任何知道自己在做什么的人都不会这样做。尽管有很多原因,但最好的例子就是为什么不这样做:

enter image description here

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


2
投票

不,如果没有 IV,您无法在 CBC 模式下加密任何内容。然而,您可以显式地将 IV 设置为零。由于 IV 与第一个普通块进行异或,因此将 IV 设置为全零相当于没有 IV。

这只是对您问题的回答,您可能需要留意迄今为止向您提供的所有其他安全建议。您可能还想检查代码是否实际上使用需要 IV 的 CBC 模式加密。

CBC 模式加密的 IV 的大小始终是一个块(AES 为 16 字节,但只要可用,请使用

getBlockSize()
方法。


1
投票

将密码的

Mode
属性显式设置为
ECB

ECB 是不安全的,除非您要加密的纯文本是短的、随机的、唯一的字符串。例如,它对于加密会话密钥或另一个加密密钥很有用。


0
投票

问题提出 11 年后,我来了。让我解释一下我是如何来到这里以及我解决问题的方式的。我有 C# 代码,可以生成 AES 加密文件,这些文件将在不同的服务器中使用 OpenSSL 进行解密。 OpenSSL 版本从 1.0.2 升级到 1.1.1 强制进行了一些代码更改,因此我使用 iter 将密钥和初始化向量派生从 md5 更改为 pbkdf2(HMACSHA256)。该代码工作正常,因为它正确加密了文件,但在使用以下 OpenSSL 命令解密期间出现了问题:

openssl enc aes-256-cbc -a -d -pbkdf2 -iter 100000 -in MyNameIs.txt  -out MyName_Is.txt -k d3cryt!0nP@ssw0rd

文件可以解密,但文件的第一部分有不可读的字符“J����� q��9|�qX”。我发现 thisthis 答案表明初始化向量是问题所在。我一开始做了

byte[] iv = new byte[0];
,试图在没有IV的情况下进行加密。在这样做时,我不断收到有关 IV 太短的错误。 解决方法是在加密期间在代码中使用相同的 IV,并在解密期间将其添加到 OpenSSL 命令中(转换为十六进制)。

openssl enc aes-256-cbc -a -d -pbkdf2 -iter 100000 -in MyNameIs.txt  -out MyName_Is.txt -k d3cryt!0nP@ssw0rd -iv 4a6d615f697440324a3138235e699e76

希望这对某人有用。

© www.soinside.com 2019 - 2024. All rights reserved.