生成和存储所有DES密钥
Generation and storage of all DES keys
我正在使用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左右的键的差异不会对性能产生任何影响)。
相关文章:
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 允许从 std::map 的密钥窃取资源?
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 在没有密钥的情况下读取密文的剩余噪声预算
- 如何修复无效的API密钥,IP或操作权限错误?
- 所有可能的链接生成器与64位密钥
- 如何在unordered_map中更改密钥?
- 获取当前密钥状态?
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 将密钥发送到非前台的游戏窗口
- 有哪些方法可以对基于 256 位密钥的矩阵进行加扰?
- 如何在精灵表上的两个不同部分之间来回切换,同时用户仍使用 SFML 持有密钥
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- 运行密钥密码解密知道密钥?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 三重DES加密需要多少个密钥?
- 加密++ DES实现和密钥长度
- 使用16字节密钥的C++Des加密
- 生成和存储所有DES密钥