生成和存储所有DES密钥

Generation and storage of all DES keys

本文关键字:DES 密钥 存储      更新时间:2023-10-16

我正在使用c++和CUDA编写数据加密标准"cracker"。这将是一个简单的暴力破解——尝试所有可能的密钥来解密加密的数据,并检查结果是否等于初始的纯文本消息。

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

你有什么改进的建议吗?

实际上并不需要递归,也不需要存储键。

DES密钥的所有空间(如果我们不计算12个左右的弱密钥,这不会为你的目的改变任何东西)是一个56位长的数字空间(顺便说一句,它适合标准uint64_t),你可以只迭代从0到2^56-1的数字,当核心报告它是用前一个密钥完成时,将下一个数字作为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左右的键的差异不会对性能产生任何影响)。