#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来保护密码,这是要求。