java - 如何为Meet-In-The-Middle攻击制作一个集合?
问题描述
我想创建一个集合,可用于查找值之间的匹配项。如您所知,恢复 Double DES 的密钥需要三个步骤。给出明文和密文:
- 使用所有 2^56 个可能的密钥加密明文并存储结果
- 使用所有 2^56 个可能的密钥解密密文并存储结果
- 检查结果匹配的位置以检索密钥
我正在尝试做的事情:我目前正在对双 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[]>();
,其中第一个字节数组包含可能的密钥,第二个数组包含加密/解密的结果
解决方案
以下是基本大纲:
您获得了一个明文和密文对 (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());
}
}
推荐阅读
- azure - 如何从 Azure DevOps 中的构建管道创建更改集以将某些文件推送到我的存储库
- react-native - Expo React Native 找不到模块'./assets/empty-module.js'
- terraform - 升级 terraform 提供程序会导致“状态中的资源实例数据无效”错误
- java - 在 Java 中用流 api 替换多个 FOR 循环的最佳方法
- npm - Verdaccio,npm 离线
- r - 正则表达式 - 使用 (1) 连字符或 (2) 句尾过滤
- python - 用 int 填充 pandas 数据框 - TypeError
- c++ - “在函数中:未定义的引用”静态库错误
- python - 在 kivy 弹出窗口中选择文件时出现索引错误
- php - 多参数控制台命令上不存在参数时间