【问题标题】:How to AES Encrypt in .NET without an IV如何在没有 IV 的情况下在 .NET 中进行 AES 加密
【发布时间】:2012-04-24 22:57:33
【问题描述】:

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

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

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

【问题讨论】:

  • 我 100% 不明白这个问题。为什么需要匹配加密? (通常只关心解密是否有效,而不是多次加密的相同数据在加密时看起来相同)。
  • 实际上,Classic ASP 应用程序正在加密和解密 AES 字符串,但主要是解密来自 .Net 应用程序的字符串。所以我需要在 .Net 中使用 AES 进行加密,并且能够使用提供的 AES 的 vbScript 实现(似乎不支持 IV)在 Classic ASP 中解密该字符串,因为 vbScript 本身不支持 AES。

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


【解决方案1】:

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

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

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

【讨论】:

  • 有些应用中 ECB 是安全且合适的。
  • 非常少和非常具体的事情不太可能是简单的 Web 服务所做的,但它们确实存在。但是,编写一个仅支持该功能的加密库几乎是业余时间。
  • 自己编写加密库几乎是业余时间。
  • 我在经典 asp 中使用的加密库是(如果我相信源代码中编写的 cmets)是 AES 的 C 实现的 vbscript 改编
  • 伟大的 Jeff Atwood 引用:“老实说,我没有意识到可以选择不进行某种块链接的密码模式!CipherMode.ECB?更像是 CipherMode.Fail!”
【解决方案2】:

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

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

用于 CBC 模式加密的 IV 始终是一个块大小(对于 AES 为 16 个字节,但在可用时使用getBlockSize() 方法。

【讨论】:

    【解决方案3】:

    将密码的Mode 属性显式设置为ECB

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

    【讨论】:

    • 或计数器,如 CTR 模式下的 AES。
    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多