我正在使用C ++和CUDA编写数据加密标准“cracker”。这将是简单的暴力 - 尝试所有可能的密钥来解密加密数据并检查结果是否等于初始纯文本消息。
问题是生成2 ^ 56个密钥需要时间(和内存)。我的第一种方法是递归生成密钥并将它们保存到文件中。
您对如何改善这一点有什么建议吗?
答案 0 :(得分:2)
DES密钥的所有空间(如果我们不计算12个左右的弱密钥,它们不会为了您的目的而改变任何东西)是一个56位长的空间(BTW适合于标准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(严格来说就是核心 - 我应该只在写入永久存储器的数字之后)它之前的所有数字都已经被CUDA核心处理过了,但一般来说,2000左右的密钥的差异不会在性能方面产生任何差异。