【问题标题】:How to make a collection for the Meet-In-The-Middle attack?如何为Meet-In-The-Middle攻击制作一个集合?
【发布时间】:2018-11-21 18:54:15
【问题描述】:

我想创建一个集合,可用于查找值之间的匹配项。如您所知,恢复 Double DES 的密钥需要三个步骤。给出明文和密文:

  1. 使用所有 2^56 个可能的密钥加密明文并存储结果
  2. 使用所有 2^56 个可能的密钥解密密文并存储结果
  3. 检查结果匹配的位置以检索密钥

我正在尝试做的事情: 我目前正在对双 DES 进行中间相遇攻击,我已经达到了必须加密/解密明文/密文 2^56 次并存储结果以找到任何匹配项的地步。

现在,我将结果存储在两个HashMaps 中,其中存储了使用的密钥和加密/解密的结果。但是,我无法弄清楚如何比较两个 HashMaps 的结果,然后确定使用了哪些键。

所以,我的第二个想法可能是使用ListMultimap 代替我可以使用使用的密钥存储加密/解密结果的地方,但话又说回来,我不知道如何找到匹配项。匹配项不一定在同一行。

编辑:

我尝试使用我的两个 HashMap,但没有成功,即我无法比较地图

for (int i = 0; i <  Math.pow(2, 20); i++) {

    for (int j = 0; j < Math.pow(2, 20); j++) {

        if(hmap1.values().toArray()[i].equals(hmap2.values().toArray()[j]) )    
             System.out.println(hmap1.keySet().toArray()[i] + " = " + hmap2.keySet().toArray()[i] );    
        }
 }

我忘了提到,为了测试,我正在使用具有 20 个有效位的密钥。因此,将有 2^20 个可能的键

我也忘了提及我的 HashMap 包含的内容。它们包含两个字节数组static Map&lt;byte[], byte[]&gt; hmap1 = new HashMap&lt;byte[], byte[]&gt;();,其中第一个字节数组包含可能的密钥,第二个数组包含加密/解密的结果

【问题讨论】:

  • 你需要一个循环而不是双循环。一个循环在第二个搜索中迭代一个哈希图。
  • 你不存储#2的结果。
  • 使用集合交集为here
  • @JamesKPolk:那我要如何找到解密的密钥呢?
  • 很遗憾,您遗漏了有关实施的关键细节。你说你有 HashMaps 但你没有说什么是 HashMap 查找键及其值。由于您拥有 DES 密钥和 DES 加密结果,因此这很重要。

标签: java encryption collections hashmap


【解决方案1】:

这是基本大纲:

你得到一个明文和密文对(P,C),你知道这是双DES的结果:

C = DESk2(DESk1(P))

现在,您将创建一个 HashMap,将 DES 中间输出映射到创建它的 DES 密钥 k1。所以这很重要:不要对 HashMap keys 和 DES keys 感到困惑,这只是一个不幸的名称重载。为避免混淆,我将把 DES 密钥称为 cryptokeys。所以 HashMap 是 64 位 DES 输出 56 位(或玩具情况下为 20 位)DES 加密密钥。

Java 伪代码:

Map<Long, CryptoKey> forwardMap = new HashMap();
for (CryptoKey k1=0; k1 < (1 << 20); k1++) {
    Long intermediateCipher = DES-Encrypt(k1, P);
    forwardMap.put(intermediateCipher, k1);
}

现在用 Java 伪代码运行攻击:

for(CryptoKey k2=0; k2 < (1 << 20); k2++) {
    Long intermediateCipher = DES-Decrypt(k2, C);
    if (forwardMap.contains(intermediateCipher)) {
        k1 = forwardMap.get(intermediateCipher);
        System.out.printf("k1=%s, k2=%s work", k1.toString(), k2.toString());
    }
}

【讨论】:

  • 你不能使用byte[]作为key,它没有实现hashCodeequals,所以它不起作用,即forwardMap.contains(intermediateCipher)总是返回false
  • @FedericoPeraltaSchaffner:谢谢,我会改的。
  • @JamesKPolk;我只是想确定一些事情。 for 循环中的 CryptoKeys 是什么?我读到您已将 DES 密钥命名为cryptokey,但是如何在 for 循环中使用它们?
猜你喜欢
  • 1970-01-01
  • 2020-05-05
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多