C++ 使用AES加密:保护您的数据安全
C++ 使用AES加密:保护您的数据安全
这份教程将引导您使用C++和强大的AES加密算法来保护您的数据安全。我们将提供完整的代码示例,涵盖以下方面:
- 加密明文* 加密文件* 加密文件夹
代码示例cpp#include #include #include <SQLiteCpp/SQLiteCpp.h>#include <cryptopp/aes.h>#include <cryptopp/modes.h>#include <cryptopp/filters.h>#include <cryptopp/osrng.h>#include <cryptopp/files.h>#include
// 数据库文件路径const std::string DATABASE_PATH = 'users.db';
// 创建用户表void createUsersTable(SQLite::Database& db) { db.exec('CREATE TABLE IF NOT EXISTS users(' 'id INTEGER PRIMARY KEY AUTOINCREMENT,' 'username TEXT UNIQUE,' 'password TEXT,' 'email TEXT,' 'aes_key TEXT' ')');}
// 用户注册void registerUser(SQLite::Database& db, const std::string& username, const std::string& password, const std::string& email) { SQLite::Statement query(db, 'INSERT INTO users (username, password, email, aes_key) VALUES (?, ?, ?, ?)');
// 生成随机AES密钥 CryptoPP::AutoSeededRandomPool rng; byte aesKey[CryptoPP::AES::DEFAULT_KEYLENGTH]; rng.GenerateBlock(aesKey, sizeof(aesKey));
// 将密钥转换为十六进制字符串 std::string aesKeyHex; CryptoPP::HexEncoder hexEncoder(new CryptoPP::StringSink(aesKeyHex)); hexEncoder.Put(aesKey, sizeof(aesKey)); hexEncoder.MessageEnd();
query.bind(1, username); query.bind(2, password); query.bind(3, email); query.bind(4, aesKeyHex); query.exec();}
// 用户登录bool loginUser(SQLite::Database& db, const std::string& username, const std::string& password) { SQLite::Statement query(db, 'SELECT COUNT(*) FROM users WHERE username = ? AND password = ?'); query.bind(1, username); query.bind(2, password); if (query.executeStep()) { int count = query.getColumn(0).getInt(); return count > 0; } return false;}
// AES加密std::string AES_Encrypt(const std::string& plaintext, const std::string& key) { std::string ciphertext;
CryptoPP::AES::Encryption aesEncryption((byte*)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH); CryptoPP::ECB_Mode_ExternalCipher::Encryption encryption(aesEncryption);
CryptoPP::StringSink stringSink(ciphertext);
CryptoPP::StreamTransformationFilter encryptor(encryption, &stringSink); encryptor.Put(reinterpret_cast<const byte*>(plaintext.c_str()), plaintext.length() + 1); encryptor.MessageEnd();
return ciphertext;}
// 加密文件void encryptFile(const std::string& filename, const std::string& key) { std::ifstream inputFile(filename, std::ios::binary); std::string plaintext((std::istreambuf_iterator
std::string encrypted = AES_Encrypt(plaintext, key);
std::ofstream outputFile(filename, std::ios::binary); outputFile.write(encrypted.c_str(), encrypted.length());}
// 加密文件夹void encryptFolder(const std::string& folderName, const std::string& key) { for (const auto& entry : std::filesystem::directory_iterator(folderName)) { if (entry.is_regular_file()) { encryptFile(entry.path().string(), key); } }}
// 主函数int main() { SQLite::Database db(DATABASE_PATH, SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);
// 创建用户表 createUsersTable(db);
// 用户注册 std::string username, password, email; std::cout << '请输入用户名:'; std::cin >> username; std::cout << '请输入密码:'; std::cin >> password; std::cout << '请输入邮箱:'; std::cin >> email;
registerUser(db, username, password, email);
// 用户登录 std::string loginUsername, loginPassword; std::cout << '请输入登录用户名:'; std::cin >> loginUsername; std::cout << '请输入登录密码:'; std::cin >> loginPassword;
if (loginUser(db, loginUsername, loginPassword)) { std::cout << '登录成功!' << std::endl;
// 获取用户的AES密钥 SQLite::Statement query(db, 'SELECT aes_key FROM users WHERE username = ?'); query.bind(1, loginUsername);
if (query.executeStep()) { std::string aesKeyHex = query.getColumn(0).getString();
// 将密钥从十六进制字符串转换回byte数组 std::string aesKey; CryptoPP::HexDecoder hexDecoder(new CryptoPP::StringSink(aesKey)); hexDecoder.Put(reinterpret_cast<const byte*>(aesKeyHex.c_str()), aesKeyHex.length()); hexDecoder.MessageEnd();
// AES加密 std::string plaintext; std::cout << '请输入要加密的明文:'; std::cin >> plaintext;
std::string encrypted = AES_Encrypt(plaintext, aesKey); std::cout << '加密后的密文: ' << encrypted << std::endl;
// 加密文件 std::string filename; std::cout << '请输入要加密的文件名:'; std::cin >> filename;
encryptFile(filename, aesKey); std::cout << '文件已成功加密!' << std::endl;
// 加密文件夹 std::string folderName; std::cout << '请输入要加密的文件夹名:'; std::cin >> folderName;
encryptFolder(folderName, aesKey); std::cout << '文件夹已成功加密!' << std::endl; } } else { std::cout << '登录失败!' << std::endl; }
return 0;}
代码解释
-
头文件: 代码首先包含了必要的头文件,包括用于输入输出 (
iostream)、字符串操作 (string)、SQLite数据库操作 (SQLiteCpp/SQLiteCpp.h)、AES加密 (cryptopp/aes.h)、加密模式 (cryptopp/modes.h)、数据过滤器 (cryptopp/filters.h)、随机数生成 (cryptopp/osrng.h)、文件操作 (cryptopp/files.h) 和文件系统操作 (filesystem)。 -
数据库操作: 代码使用SQLite数据库来存储用户信息,包括用户名、密码和AES密钥。
createUsersTable函数用于创建用户表,registerUser函数用于注册新用户并将生成的AES密钥存储在数据库中,loginUser函数用于验证用户登录信息。 -
AES加密:
AES_Encrypt函数使用AES算法对明文进行加密。它首先将密钥转换为字节数组,然后使用ECB模式进行加密。最后,将加密后的密文存储在ciphertext变量中并返回。 -
文件和文件夹加密:
encryptFile函数使用AES算法对文件进行加密。它首先读取文件内容,然后使用AES_Encrypt函数对文件内容进行加密,最后将加密后的内容写入到原始文件中。encryptFolder函数遍历指定文件夹中的所有文件,并调用encryptFile函数对每个文件进行加密。
安全注意事项
- 密钥管理: AES加密的安全性取决于密钥的保密性。请妥善保管您的密钥,并考虑使用更安全的密钥存储机制,例如硬件安全模块(HSM)。* 加密模式: 本示例使用了ECB模式,这是一种简单的加密模式,但容易受到某些攻击。在实际应用中,建议使用更安全的加密模式,例如CBC或GCM。* 错误处理: 为了简洁起见,本示例省略了一些错误处理代码。在实际应用中,请务必添加必要的错误处理代码,以确保程序的健壮性。
总结
本教程介绍了如何使用C++和AES算法来加密数据,并提供了加密明文、文件和文件夹的完整代码示例。请记住,数据安全至关重要,请务必采取适当的安全措施来保护您的敏感信息。
原文地址: https://www.cveoy.top/t/topic/dhJb 著作权归作者所有。请勿转载和采集!