c++ - 所有 DES key 的生成和存储

标签 c++ algorithm

我正在使用 C++ 和 CUDA 编写数据加密标准“cracker”。这将是简单的蛮力 - 尝试所有可能的 key 来解密加密数据并检查结果是否等于初始纯文本消息。

问题是生成 2^56 个 key 需要时间(和内存)。我的第一种方法是递归生成 key 并将它们保存到文件中。

你有什么改进的建议吗?

最佳答案

你真的不需要递归,也不需要存储你的 key 。

DES key 的所有空间(如果我们不计算 12 个左右的弱 key ,这不会为您的目的改变任何东西)是 56 位长数字的空间(顺便说一句,它适合标准 uint64_t),并且您可以遍历从 0 到 2^56-1 的数字,每当核心报告它已使用前一个 key 完成时,将下一个数字作为 56 位数字提供给您的 CUDA 核心。

如果不是内核,代码可能如下所示:

for(uint64_t i=0;i<0xFFFFFFFFFFFFFFULL /* double-check number of F's so the number is 2^56-1 */;++i) { 

  uint8_t key[7];
  //below is endianness-agnostic conversion
  key[0] = (uint8_t)i;
  key[1] = (uint8_t)(i>>8);
  key[2] = (uint8_t)(i>>16);
  key[3] = (uint8_t)(i>>24);
  key[4] = (uint8_t)(i>>32);
  key[5] = (uint8_t)(i>>40);
  key[6] = (uint8_t)(i>>48);
  bool found = try_your_des_code(key,data_to_decrypt);
  if(found) printf("Eureka!\n");
}

为了在出现任何问题时允许重新启动您的程序,您需要存储(在持久性存储中,例如文件)只有这个数字 i(严格来说,有核心 - 数字 i 应该只在之后写入持久性存储在它已经被 CUDA 内核处理之前的所有数字,但通常 2000 个左右的键的差异不会对性能产生任何影响)。

关于c++ - 所有 DES key 的生成和存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30555214/

相关文章:

java - 用 map 实现树

java - 在 Java 中找到百万分之一的斐波那契数列

c++ - SOIL2 文件上未解析的外部符号 - 需要 opengl 调用

c++,从文件读取到结构,然后读取到 vector (结构被插入 vector 太多次而不是一次)

algorithm - 如何将 Redis 中的排行榜限制为仅 N 个元素?

algorithm - 从一个点找到最近的圆

c++ - Glew 问题, Unresolved external 问题

c++ - 为什么只有一个参数的可变参数模板与非可变参数模板不同?

具有任意类型值的 C++ 关联数组

algorithm - '3 jugs of water' 的状态图