Linux C++如何进行数据加密
导读:在Linux环境下使用C++进行数据加密,可以采用多种加密算法和库。以下是一些常用的方法和步骤: 1. OpenSSL库 OpenSSL是一个强大的加密库,支持多种加密算法。 安装OpenSSL 在大多数Linux发行版中,OpenSSL已...
在Linux环境下使用C++进行数据加密,可以采用多种加密算法和库。以下是一些常用的方法和步骤:
1. OpenSSL库
OpenSSL是一个强大的加密库,支持多种加密算法。
安装OpenSSL
在大多数Linux发行版中,OpenSSL已经预装。如果没有,可以使用包管理器安装:
sudo apt-get install libssl-dev # Debian/Ubuntu
sudo yum install openssl-devel # CentOS/RHEL
示例代码
以下是一个使用OpenSSL进行AES加密和解密的示例:
#include <
openssl/aes.h>
#include <
openssl/rand.h>
#include <
iostream>
#include <
vector>
// 加密函数
std::vector<
unsigned char>
encrypt(const std::vector<
unsigned char>
&
plaintext, const std::vector<
unsigned char>
&
key) {
AES_KEY enc_key;
AES_set_encrypt_key(key.data(), 256, &
enc_key);
int len = plaintext.size();
int ciphertext_len = len + AES_BLOCK_SIZE;
std::vector<
unsigned char>
ciphertext(ciphertext_len);
AES_encrypt(plaintext.data(), ciphertext.data(), &
enc_key);
return ciphertext;
}
// 解密函数
std::vector<
unsigned char>
decrypt(const std::vector<
unsigned char>
&
ciphertext, const std::vector<
unsigned char>
&
key) {
AES_KEY dec_key;
AES_set_decrypt_key(key.data(), 256, &
dec_key);
int len = ciphertext.size();
int plaintext_len = len - AES_BLOCK_SIZE;
std::vector<
unsigned char>
plaintext(plaintext_len);
AES_decrypt(ciphertext.data(), plaintext.data(), &
dec_key);
return plaintext;
}
int main() {
std::vector<
unsigned char>
key = {
/* 32字节密钥 */ }
;
std::vector<
unsigned char>
plaintext = {
/* 明文数据 */ }
;
auto ciphertext = encrypt(plaintext, key);
auto decryptedtext = decrypt(ciphertext, key);
std::cout <
<
"Original: ";
for (auto c : plaintext) std::cout <
<
c;
std::cout <
<
std::endl;
std::cout <
<
"Decrypted: ";
for (auto c : decryptedtext) std::cout <
<
c;
std::cout <
<
std::endl;
return 0;
}
2. Crypto++
Crypto++是另一个流行的C++加密库,提供了丰富的加密算法和功能。
安装Crypto++
在大多数Linux发行版中,可以使用包管理器安装:
sudo apt-get install libcrypto++-dev # Debian/Ubuntu
sudo yum install crypto++-devel # CentOS/RHEL
示例代码
以下是一个使用Crypto++进行AES加密和解密的示例:
#include <
cryptopp/aes.h>
#include <
cryptopp/modes.h>
#include <
cryptopp/filters.h>
#include <
iostream>
#include <
vector>
// 加密函数
std::vector<
unsigned char>
encrypt(const std::vector<
unsigned char>
&
plaintext, const std::vector<
unsigned char>
&
key) {
using namespace CryptoPP;
std::vector<
unsigned char>
ciphertext(plaintext.size() + AES::BLOCKSIZE);
CBC_Mode<
AES>
::Encryption enc;
enc.SetKeyWithIV(key.data(), key.size(), key.data());
StringSource ss1(plaintext, true,
new StreamTransformationFilter(enc,
new StringSink(ciphertext)
) // StreamTransformationFilter
);
// StringSource
return ciphertext;
}
// 解密函数
std::vector<
unsigned char>
decrypt(const std::vector<
unsigned char>
&
ciphertext, const std::vector<
unsigned char>
&
key) {
using namespace CryptoPP;
std::vector<
unsigned char>
decryptedtext(ciphertext.size());
CBC_Mode<
AES>
::Decryption dec;
dec.SetKeyWithIV(key.data(), key.size(), key.data());
StringSource ss2(ciphertext, true,
new StreamTransformationFilter(dec,
new StringSink(decryptedtext)
) // StreamTransformationFilter
);
// StringSource
return decryptedtext;
}
int main() {
std::vector<
unsigned char>
key = {
/* 32字节密钥 */ }
;
std::vector<
unsigned char>
plaintext = {
/* 明文数据 */ }
;
auto ciphertext = encrypt(plaintext, key);
auto decryptedtext = decrypt(ciphertext, key);
std::cout <
<
"Original: ";
for (auto c : plaintext) std::cout <
<
c;
std::cout <
<
std::endl;
std::cout <
<
"Decrypted: ";
for (auto c : decryptedtext) std::cout <
<
c;
std::cout <
<
std::endl;
return 0;
}
3. GnuPG
GnuPG是一个用于加密和解密的工具,也可以通过C++接口使用。
安装GnuPG
在大多数Linux发行版中,可以使用包管理器安装:
sudo apt-get install gnupg2 # Debian/Ubuntu
sudo yum install gnupg2 # CentOS/RHEL
示例代码
以下是一个使用GnuPG进行加密和解密的示例:
#include <
gpgme.h>
#include <
iostream>
#include <
vector>
// 加密函数
std::vector<
unsigned char>
encrypt(const std::vector<
unsigned char>
&
plaintext, const std::string&
recipient) {
gpgme_check_version(NULL);
gpgme_error_t err = gpgme_new(&
ctx);
if (err) throw std::runtime_error("gpgme_new() failed");
err = gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
if (err) throw std::runtime_error("gpgme_set_protocol() failed");
err = gpgme_set_hostkeycheck(ctx, true);
if (err) throw std::runtime_error("gpgme_set_hostkeycheck() failed");
err = gpgme_data_new_from_mem(&
in, plaintext.data(), plaintext.size());
if (err) throw std::runtime_error("gpgme_data_new_from_mem() failed");
err = gpgme_data_new(&
out);
if (err) throw std::runtime_error("gpgme_data_new() failed");
err = gpgme_op_encrypt(ctx, in, out, recipient.c_str());
if (err) throw std::runtime_error("gpgme_op_encrypt() failed");
size_t out_len;
err = gpgme_data_seek(out, 0, SEEK_SET);
if (err) throw std::runtime_error("gpgme_data_seek() failed");
err = gpgme_data_read(out, out_len);
if (err) throw std::runtime_error("gpgme_data_read() failed");
gpgme_data_release(in);
gpgme_data_release(out);
gpgme_close(ctx);
return std::vector<
unsigned char>
(out_len, out_len);
}
// 解密函数
std::vector<
unsigned char>
decrypt(const std::vector<
unsigned char>
&
ciphertext, const std::string&
passphrase) {
gpgme_check_version(NULL);
gpgme_error_t err = gpgme_new(&
ctx);
if (err) throw std::runtime_error("gpgme_new() failed");
err = gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
if (err) throw std::runtime_error("gpgme_set_protocol() failed");
err = gpgme_set_hostkeycheck(ctx, true);
if (err) throw std::runtime_error("gpgme_set_hostkeycheck() failed");
err = gpgme_data_new_from_mem(&
in, ciphertext.data(), ciphertext.size());
if (err) throw std::runtime_error("gpgme_data_new_from_mem() failed");
err = gpgme_data_new(&
out);
if (err) throw std::runtime_error("gpgme_data_new() failed");
err = gpgme_op_decrypt(ctx, in, out, passphrase.c_str());
if (err) throw std::runtime_error("gpgme_op_decrypt() failed");
size_t out_len;
err = gpgme_data_seek(out, 0, SEEK_SET);
if (err) throw std::runtime_error("gpgme_data_seek() failed");
err = gpgme_data_read(out, out_len);
if (err) throw std::runtime_error("gpgme_data_read() failed");
gpgme_data_release(in);
gpgme_data_release(out);
gpgme_close(ctx);
return std::vector<
unsigned char>
(out_len, out_len);
}
int main() {
std::string recipient = "recipient@example.com";
std::string passphrase = "your_passphrase";
std::vector<
unsigned char>
plaintext = {
/* 明文数据 */ }
;
auto ciphertext = encrypt(plaintext, recipient);
auto decryptedtext = decrypt(ciphertext, passphrase);
std::cout <
<
"Original: ";
for (auto c : plaintext) std::cout <
<
c;
std::cout <
<
std::endl;
std::cout <
<
"Decrypted: ";
for (auto c : decryptedtext) std::cout <
<
c;
std::cout <
<
std::endl;
return 0;
}
总结
以上是几种在Linux环境下使用C++进行数据加密的方法。选择哪种方法取决于你的具体需求和偏好。OpenSSL和Crypto++提供了丰富的加密算法和功能,而GnuPG则更适合处理PGP加密。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux C++如何进行数据加密
本文地址: https://pptw.com/jishu/771673.html
