我正在使用 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/