如何收集“中间相遇”攻击的集合?

时间:2018-11-21 18:54:16

标签: java encryption collections hashmap

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

  1. 使用所有2 ^ 56个可能的密钥加密纯文本并存储结果
  2. 使用所有2 ^ 56个可能的密钥解密密文并存储结果
  3. 检查结果在哪里匹配以检索密钥

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

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

因此,我的第二个想法可能是使用ListMultimap代替,我可以在其中使用所使用的密钥存储来自加密/解密的结果,但是同样,我也不知道如何找到匹配项。匹配不一定位于同一行。

编辑:

我尝试了两个HashMap,但没有成功,即无法比较Maps

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<byte[], byte[]> hmap1 = new HashMap<byte[], byte[]>();,其中第一个字节数组包含可能的密钥,第二个字节数组包含加密/解密的结果

1 个答案:

答案 0 :(得分:1)

这是基本轮廓:

您获得了明文和密文对(P,C),您知道这是Double DES的结果:

C = DES k2 (DES k1 (P))

现在,您将创建一个HashMap,该映射将DES中间输出映射到创建它的DES密钥k1。因此,这很重要:不要被HashMap 和DES 所迷惑,这只是不幸的名称重载。为避免混淆,我将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());
    }
}