在给定明文及其密文的情况下计算 AES 加密密钥?

信息安全 密码学 加密 密钥管理
2021-08-27 00:09:00

我的任务是在 Oracle 中创建包含加密字符串的数据库表(即列是 RAW)。字符串由应用程序加密(使用 AES,128 位密钥)并存储在 Oracle 中,然后从 Oracle 检索并解密(即,Oracle 本身永远不会看到未加密的字符串)。

我遇到了这一列,它将是两个字符串之一。我担心有人会注意到并大概弄清楚这两个值是什么来找出 AES 密钥。

例如,如果有人看到该列是 Ciphertext #1 或 #2:

  • 密文#1:

    BF,4F,8B,FE, 60,D8,33,56, 1B,F2,35,72, 49,20,DE,C6.
    
  • 密文#2:

    BC,E8,54,BD, F4,B3,36,3B, DD,70,76,45, 29,28,50,07.
    

并知道相应的明文:

  • 明文#1(“底特律”):

    44,00,65,00, 74,00,72,00, 6F,00,69,00, 74,00,00,00.
    
  • 明文#2(“芝加哥”):

    43,00,68,00, 69,00,63,00, 61,00,67,00, 6F,00,00,00.
    

他能推断出加密密钥是“Buffalo”吗?

42,00,75,00, 66,00,66,00, 61,00,6C,00, 6F,00,00,00.

我在想应该只有一个 128 位密钥可以将明文#1 转换为密文#1。这是否意味着我应该转而使用 192 位或 256 位密钥,或者寻找其他解决方案?

(顺便说一句,这里有另外两个相同明文但密钥不同的密文。)

  • 密文#1 A(“底特律”):

    E4,28,29,E3, 6E,C2,64,FA, A1,F4,F4,96, FC,18,4A,C5.
    
  • 密文#2 A(“芝加哥”):

     EA,87,30,F0, AC,44,5D,ED, FD,EB,A8,79, 83,59,53,B7.
    

[相关问题:使用AES和CBC时,IV可以是明文的哈希吗?]

4个回答

我正在将答案添加为社区 wiki,因为我认为接受的答案具有危险的误导性这是我的推理:

问题是询问是否能够派生 AES 密钥。在这方面,公认的答案是正确的:这被称为Known-plaintext Attack,并且 AES 可以抵抗这种攻击。因此,攻击者将无法利用它来获取密钥并窃取整个数据库。

但是这里还有另一种潜在的危险攻击:文不可区分攻击来自维基百科:

密文不可区分性是许多加密方案的属性。直观地说,如果密码系统具有不可区分性,那么攻击者将无法根据它们加密的消息来区分密文对。

OP 向我们展示了该列包含两个可能值之一,并且由于加密是确定性的(即不使用随机 IV),攻击者可以看到哪些行具有相同的值。攻击者所要做的就是找出该列的单行明文,他们已经破解了整个列的加密。坏消息,如果您希望该数据保持私密性-我假设这就是您首先对其进行加密的原因。

缓解: 为了防止这种情况,请使您的加密具有不确定性(或至少对攻击者来说是不确定的),以便对相同明文的重复加密产生不同的密文。例如,您可以通过在密码块链接 (CBC) 模式中使用带有随机初始化向量 (IV)的 AES 来执行此操作。使用安全随机数生成器为每一行生成一个新的 IV 并将 IV 存储在表中。这样,如果没有密钥,攻击者就无法分辨出哪些行具有匹配的明文。

对于具有n位密钥的分组密码,如果给定一个明文分组和相应的密文,平均可以在不到2 n-1步内猜出密钥,则该分组密码将被称为“破解”密码学家会强调不使用它。AES 没有损坏(还)。所以不用担心。

不过还是有几点要说:

  • 拥有明文和相应的密文允许攻击者验证潜在的密钥值。
  • 所述2 n-1个值实际上是关键空间的大小的一半。这个想法是攻击者可以尝试所有可能的密钥,直到一个匹配。平均而言,他必须尝试一半的琴键才能击中正确的琴键。这假设密钥空间的大小为2 n您仍然有可能减少密钥空间:例如,如果您确定您的密钥是美国城镇的名称,那么可能的密钥数量要少得多(美国不得超过 100000 个城镇) . 因此,只有当您的密钥生成过程确实可以生成任何 128 位密钥时,您才能获得承诺的 128 位安全性。
  • 您显然通过将每个值直接填充到 AES 核心中来加密每个值。AES 是确定性的,这意味着具有相同值的两个单元将产生相同的加密块,任何攻击者都可能注意到这一点。换句话说,您泄漏了有关哪些单元格彼此相等的信息。根据您的情况,这可能是也可能不是问题;你应该意识到这一点。
  • 你没有说你如何处理超过 16 个字节的值。这不是一个简单的问题。总的来说,这需要一个链接模式,如 CBC,和一个初始化向量(它取决于模式;对于 CBC,一个 16 字节的随机值——每个加密值都有一个新的 IV)(这也可以修复信息从上一点泄漏)。

答案:不,在这种情况下无法恢复 AES 密钥。AES 对于已知明文攻击是安全的。这意味着,即使攻击者知道明文及其对应的密文(在某个未知的 AES 密钥下加密),攻击者也无法恢复 AES 密钥。特别是,攻击者无法比简单地一个接一个地尝试可能的密钥更快地恢复 AES 密钥——假设 AES 密钥是随机选择的,这个过程将花费比我们文明的生命周期更长的时间。

PS我注意到无论您使用什么加密似乎都没有使用IV。这是一个安全风险。我不知道您使用的是什么操作模式,但您应该使用带有随机 IV 的广受好评的加密模式(例如,CBC 模式加密、CTR 模式加密)。多次加密同一消息总是每次都会给你相同的密文这一事实是安全漏洞,最好避免。您可以通过使用带有适当 IV 的标准操作模式来避免这种泄漏。(您可能还应该使用消息验证码 (MAC) 来验证密文并防止对其进行修改。)

加盐你的加密。

这样你的加密就不会有任何模式。(还有其他好处!)

https://stackoverflow.com/questions/5051007/what-is-the-purpose-of-salt