gpt4 book ai didi

java - 如何为中间相遇攻击收集数据?

转载 作者:行者123 更新时间:2023-11-30 05:54:24 27 4
gpt4 key购买 nike

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

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

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

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

所以,我的第二个想法可能是使用 ListMultimap相反,我可以在其中存储使用所使用的 key 的加密/解密结果,但话又说回来,我不知道如何找到匹配项。匹配项不一定位于同一行。

编辑:

我用我的两个 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 个有效位的 key 。因此,将有 2^20 个可能的键

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

最佳答案

以下是基本概要:

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

C = DESk2(DESk1(P))

现在,您将创建一个 HashMap,将 DES 中间输出映射到创建它的 DES key k1。所以这一点很重要:不要被 HashMap 键和 DES 键混淆,这只是一个不幸的名称重载。为了避免混淆,我将 DES key 称为“cryptokeys”。因此,HashMap 是 64 位 DES 输出 56 位(或者在你的玩具中是 20 位)DES 加密 key 。

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());
}
}

关于java - 如何为中间相遇攻击收集数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53418819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com