我想创建一个集合,该集合可用于在值之间查找匹配项。如您所知,恢复Double DES的密钥需要三个步骤。给出明文和密文:
我正在尝试做的事情: 我目前正在针对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[]>();
,其中第一个字节数组包含可能的密钥,第二个字节数组包含加密/解密的结果
答案 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());
}
}