所以我使用Crypto ++库来加密文件。我需要保存密钥和iv以备将来使用。我正在关注this教程。这是我的功能:
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()]='\0';
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的最佳方法,它是一个字节数组到一个文件,密文是一个unsigned char *到一个单独的文件。
答案 0 :(得分:1)
密钥可以保存在单独的文件中。通常,密钥在发送器/接收器之间预先建立,或者使用接收器的公钥加密。请注意,将密钥保存在密文旁边是没有意义的,因为它不会提供任何保护。密钥的处理称为密钥管理,整本书都是关于它的。
IV是一种不同的动物。 IV应随机生成。对于CFB来说,它至少应该是双方唯一且相同的。通常,IV只是以密文为前缀,它不必保密。
答案 1 :(得分:0)
您的key
和iv
变量是用于加密纯文本的密钥和IV。
你也没有填写;你实际上是使用一个填充0字节的数组作为加密的密钥和IV。
答案 2 :(得分:0)
IV是公共信息。你不需要隐藏它。以你想要的方式保存它。
KEY必须保证安全。要做到这一点,你可以决定你想要多少努力来保护它免受外部因素的影响。
另一种解决方案是,如果您不需要二进制文件上的密钥,则将其提供给系统的密码管理器。在Windows上,它被称为&#34;数据保护API&#34;,在Mac上,它被称为&#34; Keychain&#34;。看看这些,然后你会明白为什么这被认为是安全。但这是因为这里的所有密码都是用&#34;用户密码&#34;加密的。所以没有任何东西存储在磁盘上#34;在这种情况下,关闭的设备被认为是非常安全的。