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(inputFile)), 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算法来加密数据,并提供了加密明文、文件和文件夹的完整代码示例。请记住,数据安全至关重要,请务必采取适当的安全措施来保护您的敏感信息。

C++ 使用AES加密:保护您的数据安全

原文地址: https://www.cveoy.top/t/topic/dhJb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录