在 Linux 下,使用 C++ 实现加密解密可以通过多种方式来完成,例如使用 OpenSSL、GnuPG 或者自定义算法等。下面我将提供一个简单的示例,展示如何使用 OpenSSL 库在 C++ 中实现 AES 加密和解密。
首先,确保你已经安装了 OpenSSL 库。在 Ubuntu 系统中,可以使用以下命令安装:
sudo apt-get install libssl-dev
接下来,创建一个名为 crypto.cpp
的文件,并添加以下代码:
#include <iostream>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <vector>
#include <cstring>
std::vector<unsigned char> pad(const std::vector<unsigned char> &data, int blockSize) {
int padding = blockSize - data.size() % blockSize;
std::vector<unsigned char> padded_data(data.size() + padding);
std::memset(padded_data.data() + data.size(), padding, padding);
return padded_data;
}
std::vector<unsigned char> unpad(const std::vector<unsigned char> &data, int blockSize) {
int padding = data[data.size() - 1];
std::vector<unsigned char> unpadded_data(data.begin(), data.end() - padding);
return unpadded_data;
}
std::vector<unsigned char> encrypt(const std::vector<unsigned char> &plaintext, const std::vector<unsigned char> &key) {
std::vector<unsigned char> padded_plaintext = pad(plaintext, AES_BLOCK_SIZE);
std::vector<unsigned char> ciphertext(padded_plaintext.size() + AES_BLOCK_SIZE);
AES_KEY aesKey;
AES_set_encrypt_key(key.data(), key.size() * 8, &aesKey);
AES_cbc_encrypt(padded_plaintext.data(), ciphertext.data(), padded_plaintext.size(), &aesKey, nullptr, AES_ENCRYPT);
return ciphertext;
}
std::vector<unsigned char> decrypt(const std::vector<unsigned char> &ciphertext, const std::vector<unsigned char> &key) {
std::vector<unsigned char> padded_ciphertext = ciphertext;
AES_KEY aesKey;
AES_set_decrypt_key(key.data(), key.size() * 8, &aesKey);
AES_cbc_encrypt(padded_ciphertext.data(), padded_ciphertext.data(), padded_ciphertext.size(), &aesKey, nullptr, AES_DECRYPT);
return unpad(padded_ciphertext, AES_BLOCK_SIZE);
}
int main() {
std::vector<unsigned char> key = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
std::vector<unsigned char> plaintext = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
std::vector<unsigned char> encrypted = encrypt(plaintext, key);
std::vector<unsigned char> decrypted = decrypt(encrypted, key);
std::cout << "Plaintext: ";
for (unsigned char byte : plaintext) {
std::cout << std::hex << static_cast<int>(byte) << " ";
}
std::cout << std::endl;
std::cout << "Encrypted: ";
for (unsigned char byte : encrypted) {
std::cout << std::hex << static_cast<int>(byte) << " ";
}
std::cout << std::endl;
std::cout << "Decrypted: ";
for (unsigned char byte : decrypted) {
std::cout << std::hex << static_cast<int>(byte) << " ";
}
std::cout << std::endl;
return 0;
}
在这个示例中,我们使用了 OpenSSL 的 AES 加密库来实现加密和解密功能。encrypt
函数接受明文和密钥作为参数,并返回加密后的密文。decrypt
函数接受密文和密钥作为参数,并返回解密后的明文。
要编译这个程序,你需要链接 OpenSSL 库。在命令行中,使用以下命令编译:
g++ crypto.cpp -o crypto -lcrypto
然后,运行编译后的程序:
./crypto
这将输出原始明文、加密后的密文以及解密后的明文。请注意,这个示例仅用于演示目的,实际应用中可能需要更多的错误处理和安全性考虑。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。