【问题标题】:Saving key and iv to file AES implementation Crypto++将密钥和 iv 保存到文件 AES 实现 Crypto++
【发布时间】:2018-03-09 02:39:07
【问题描述】:

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

【问题讨论】:

  • 如果有任何混淆,我深表歉意,但主要是我想知道一种将字节数组(只不过是生成 Key 和 IV 的格式)存储到文件的方法。为了解决这个问题,我将它们转换为 HEX 并存储它们。

标签: c++ aes crypto++


【解决方案1】:

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

IV 是另一种动物。 IV应该是随机生成的。对于 CFB,它至少应该在两侧是唯一且相同的。通常IV只是简单地作为密文的前缀,它不必保密。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,但我认为加密功能会生成它。我需要知道如何找回它。
    • 不建议使用 IV 或 KEY 作为 0 的字符串。每次调用加密例程时都生成它们(IV 作为随机数和来自秘密/密码的密钥)。
    【解决方案3】:

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

    钥匙是您必须妥善保管的东西。为此,您可以决定要付出多少努力才能将其隐藏在外部因素之外。

    • 我有一些键,我不想将它们作为二进制代码中的“纯文本”保留。 (NO SECURITY,但我妈妈不知道该怎么做,但逆向工程师的初学者会嘲笑它。)
    • 我对字节进行了一些操作,例如反转部分,分离它们,异或某些东西。 (非常不安全,但总比没有好,具有良好逆向工程知识的程序员将能够花费一些时间并最终破坏安全性)
    • 在其他一些情况下,我使用了第 3 方高级混淆...如果可能的话,根据您的需要,您甚至可以用一些“白盒”密码术替换您的加密引擎。然后你的钥匙就会得到很好的保护。但这通常很难/昂贵。这似乎不是你的情况。 (是的,即使是非常高级的组装大师也不会乐于对这个案例进行逆向工程。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      相关资源
      最近更新 更多