所以我正在使用Crypto++库来加密文件。我需要保存密钥和 iv 以备将来使用。我正在学习本教程。这是我的函数:
void AESUtil::encrypt(string filename,bool savekeys,string savefilename){
AutoSeededRandomPool rnd;
// Generate a random key
byte key[AES::DEFAULT_KEYLENGTH];
rnd.GenerateBlock(key, AES::DEFAULT_KEYLENGTH);
// Generate a random IV
byte iv[AES::BLOCKSIZE];
rnd.GenerateBlock(iv, AES::BLOCKSIZE);
Binary b;
string plaintext = b.decoder(filename);
unsigned char *ciphertext= new unsigned char[plaintext.size()+1];
ciphertext[plaintext.size()]=' ';
if(savekeys){
ofstream("key.bin", ios::binary).write((char*)key, sizeof(key));
}
CFB_Mode<AES>::Encryption cfbEncryption(key, AES::DEFAULT_KEYLENGTH, iv);
cfbEncryption.ProcessData(ciphertext,reinterpret_cast<const unsigned char*>(plaintext.c_str()),plaintext.size()+1);
ofstream outfile(savefilename.c_str());
outfile.write((char*)ciphertext,sizeof(ciphertext));
}
该文件包含/格式的数据。我想知道以编程方式保存密钥和 iv 的最佳方法,它们是文件的字节数组和作为未签名字符*的密文到单独的文件。
密钥可以保存在单独的文件中。通常,密钥是事先在发送方/接收方之间建立的,或者使用接收方的公钥进行加密。请注意,将密钥保存在密文旁边是没有意义的,因为它不会提供任何保护。密钥的处理称为密钥管理,并且已经写了整本书。
IV是一种不同的动物。IV应该是随机生成的。对于CFB,它至少应该是唯一的,并且在两侧都是相同的。通常 IV 只是在密文中作为前缀,不必保密。
您的key
和iv
变量是用于加密纯文本的密钥和 IV。
也没有填写;你实际上使用了一个填充了0字节的数组作为密钥和IV进行加密。
IV是公共信息。你不需要隐藏它。按照您想要的方式保存它。
钥匙是你必须保持安全的东西。为此,您可以决定要付出多少努力来隐藏它免受外部因素的影响。
- 我有一些密钥,我不在乎将它们保留为二进制代码中的"纯文本"。(没有安全性,但我妈妈不知道该怎么做,但逆向工程的初学者会嘲笑它。
- 有些键我会玩字节,比如反转部分,将它们分开,用一些东西进行XOR。(非常不安全,但总比没有好,一个在逆向工程方面有良好知识的程序员将能够花一些时间并最终破坏安全性)
- 其他一些情况我使用第三方高级混淆...如果可能的话,根据你想要的,你甚至可以用一些"白盒"加密来替换你的加密引擎。然后,您的密钥将得到很好的保护。但这通常是困难/昂贵的。这似乎不是你的情况。(是的,即使是非常高级的装配大师也不会乐意开始逆向工程这种情况。
如果您不需要二进制文件上的密钥,另一种解决方案是将其提供给系统的密码管理器。在Windows上,它被称为"数据保护API",在Mac上,它被称为"钥匙串"。看看这些,然后你就会明白为什么这被认为是安全的。但这是因为这里的所有密码都使用"用户密码"加密,因此不会"磁盘"存储任何内容。在这种情况下,关闭的设备被认为是非常安全的。