这是通过AES保护我的数据的正确方法吗?

时间:2014-07-22 04:02:23

标签: c++ cryptography crypto++

#include <aes.h>
#include <filters.h>
#include <gcm.h>
#include <osrng.h>

#include <iomanip>
#include <iostream>
#include <string>

std::string encrypt_data(std::string const &data, byte *iv, byte *key,
                         size_t key_size = CryptoPP::AES::DEFAULT_KEYLENGTH)
{
    CryptoPP::GCM<CryptoPP::AES>::Encryption encryptor;        
    encryptor.SetKeyWithIV(key, key_size, iv);

    std::string ciphertext;
    CryptoPP::StringSource( data, true,
                            new CryptoPP::AuthenticatedEncryptionFilter(
                                encryptor,
                                new CryptoPP::StringSink(ciphertext)
                                )
                            );

    return ciphertext;
}

std::string decrypt_data(std::string const &data, byte *iv, byte *key,
                         size_t key_size = CryptoPP::AES::DEFAULT_KEYLENGTH)
{
    CryptoPP::GCM<CryptoPP::AES>::Decryption decryptor;
    decryptor.SetKeyWithIV(key, key_size, iv);

    std::string recovered;
    CryptoPP::StringSource( data, true,
                            new CryptoPP::AuthenticatedDecryptionFilter(
                                decryptor,
                                new CryptoPP::StringSink( recovered )
                                )
                            );

    return recovered;
}

int main()
{
    try{
        byte key[CryptoPP::AES::DEFAULT_KEYLENGTH];
        byte iv[CryptoPP::AES::BLOCKSIZE];
        CryptoPP::AutoSeededRandomPool rnd;
        rnd.GenerateBlock(key, CryptoPP::AES::BLOCKSIZE);
        rnd.GenerateBlock(iv, CryptoPP::AES::BLOCKSIZE);
        std::string const PlainText = "I love metal gear solid";
        std::string const Encrypted = encrypt_data(PlainText, iv, key);
        std::string const Decrypted = decrypt_data(Encrypted, iv, key);
        std::cout<<std::boolalpha<<(PlainText == Decrypted)<<std::endl;
    }catch(std::exception const &ex){
        std::cerr<<ex.what()<<std::endl;
    }
}

这是提供机密性和完整性的正确方法吗?在研究了一些加密++和密码学的材料之后,我仍然对此感到困惑。我计划将iv存储在数据库中,并将密钥的内容拆分到硬盘的不同位置(隐藏一堆文件中的密钥消息)。

编辑: 到现在为止我的目标是保护应用程序的密码,每台机器上的密码都是一样的(数据库需要同步)。

为什么选择AES但不支持PBKDF2? 客户希望我们使用ACE / 3DES来保护密码,这是要求。

0 个答案:

没有答案