首页 > 解决方案 > 如何为Meet-In-The-Middle攻击制作一个集合?

问题描述

我想创建一个集合,可用于查找值之间的匹配项。如您所知,恢复 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 个可能的键

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

标签: javaencryptioncollectionshashmap

解决方案


以下是基本大纲:

您获得了一个明文和密文对 (P, C),您知道这是双 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());
    }
}

推荐阅读