将密钥和iv保存到文件AES实现Crypto ++

时间:2014-11-25 22:41:14

标签: c++ aes crypto++

所以我使用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 *到一个单独的文件。

3 个答案:

答案 0 :(得分:1)

密钥可以保存在单独的文件中。通常,密钥在发送器/接收器之间预先建立,或者使用接收器的公钥加密。请注意,将密钥保存在密文旁边是没有意义的,因为它不会提供任何保护。密钥的处理称为密钥管理,整本书都是关于它的。

IV是一种不同的动物。 IV应随机生成。对于CFB来说,它至少应该是双方唯一且相同的。通常,IV只是以密文为前缀,它不必保密。

答案 1 :(得分:0)

您的keyiv变量是用于加密纯文本的密钥和IV。

你也没有填写;你实际上是使用一个填充0字节的数组作为加密的密钥和IV。

答案 2 :(得分:0)

IV是公共信息。你不需要隐藏它。以你想要的方式保存它。

KEY必须保证安全。要做到这一点,你可以决定你想要多少努力来保护它免受外部因素的影响。

  • 我有一些钥匙,我不在乎把它们作为一个简单的文字&#34;在二进制代码中。 (没有安全,但是我的妈妈不知道该怎么做,但是逆向工程师的初学者会嘲笑它。)
  • 我使用字节来处理某些键,例如反转部分,将它们分开,与某些东西进行异或。 (非常不安全,但总比没有好,在逆向工程方面具有良好知识的程序员将能够花一些时间并最终破坏安全性)
  • 其他一些情况我使用第三方高级混淆...如果可能,根据您的需要,您甚至可以用一些白盒&#34;替换您的加密引擎。加密。然后,您的钥匙将得到很好的保护。但这通常很难/昂贵。它似乎不是你的情况。 (是的,即使是非常先进的装配大师也不乐意开始对这种情况进行逆向工程。)

另一种解决方案是,如果您不需要二进制文件上的密钥,则将其提供给系统的密码管理器。在Windows上,它被称为&#34;数据保护API&#34;,在Mac上,它被称为&#34; Keychain&#34;。看看这些,然后你会明白为什么这被认为是安全。但这是因为这里的所有密码都是用&#34;用户密码&#34;加密的。所以没有任何东西存储在磁盘上#34;在这种情况下,关闭的设备被认为是非常安全的。