C++加密解密(学习资料)
1、对称加密算法
对称加密算法是指加密和解密使用同一密钥的加密算法,常见的对称加密算法有AES、DES、3DES等。这里我们以AES为例,介绍其C++实现方法。
AES算法使用分组密码,将明文分成若干个块,每个块长度为128位(16字节),然后使用相同的密钥进行加密。加密过程涉及到四个基本操作:SubBytes、ShiftRows、MixColumns和AddRoundKey。其中SubBytes、ShiftRows和MixColumns都是一些简单的元素替换、移位和乘法操作,而AddRoundKey是一个简单的异或操作。
如下:
#include <iostream>
#include <cstring>
#include <openssl/aes.h>
using namespace std;
// 加密函数
void aes_encrypt(unsigned char *in, unsigned char *out, unsigned char *key, int key_len) {
AES_KEY aes;
AES_set_encrypt_key(key, key_len, &aes);
AES_encrypt(in, out, &aes);
}
// 解密函数
void aes_decrypt(unsigned char *in, unsigned char *out, unsigned char *key, int key_len) {
AES_KEY aes;
AES_set_decrypt_key(key, key_len, &aes);
AES_decrypt(in, out, &aes);
}
int main() {
// 明文和密钥
unsigned char plaintext[] = "hello world";
unsigned char key[] = "1234567890123456";
int len = strlen((char*)plaintext);
// 加密过程
unsigned char ciphertext[len];
aes_encrypt(plaintext, ciphertext, key, 128);
// 输出加密结果
cout << "ciphertext: ";
for (int i = 0; i < len; ++i) {
printf("%02x ", ciphertext[i]);
}
cout << endl;
// 解密过程
unsigned char decryptedtext[len];
aes_decrypt(ciphertext, decryptedtext, key, 128);
// 输出解密结果
cout << "decryptedtext: ";
for (int i = 0; i < len; ++i) {
printf("%c", decryptedtext[i]);
}
cout << endl;
return 0;
}
2、非对称加密算法
非对称加密算法是指加密和解密使用不同密钥的加密算法,常见的非对称加密算法有RSA、ECC等。这里我们以RSA为例,介绍其C++实现方法。
RSA算法基于大数分解难题,它通过使用一对公钥和私钥来实现加密和解密过程。公钥可以公开发布,任何人都可以使用它来加密文本;而私钥只能由私钥持有者使用,用于解密加密文本。
如下:
#include <iostream>
#include <cstring>
#include <openssl/rsa.h>
#include <openssl/pem.h>
using namespace std;
// 加密函数
int rsa_encrypt(unsigned char *in, int in_len, unsigned char *key, unsigned char *out) {
RSA *rsa = NULL;
BIO *keybio = BIO_new_mem_buf(key, -1);
rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL);
int ret = RSA_public_encrypt(in_len, in, out, rsa, RSA_PKCS1_PADDING);
RSA_free(rsa);
BIO_free(keybio);
return ret;
}
// 解密函数
int rsa_decrypt(unsigned char *in, int in_len, unsigned char *key, unsigned char *out) {
RSA *rsa = NULL;
BIO *keybio = BIO_new_mem_buf(key, -1);
rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);
int ret = RSA_private_decrypt(in_len, in, out, rsa, RSA_PKCS1_PADDING);
RSA_free(rsa);
BIO_free(keybio);
return ret;
}
int main() {
// 明文和密钥
unsigned char plaintext[] = "hello world";
unsigned char public_key[] = "-----BEGIN PUBLIC KEY-----\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2mXa/5h05WVwpv6z3a3j\n\
fw+e8z7u3bY5U9EHQ9BZ1nVAw4BY/TCVQTA7alvXh1VPD7FhS8Q8NleRsq8PvE2U\n\
t9RjQO9CyszKfPGgOqPGSV5J3MqBrMxL4mrH7OgjW9QGyL9duA8lfqIzKy5rBVYb\n\
zRFbnvOEemGpzyVU8bT6G49xEHnuOdxafH6sWvBxbYYkebJrws4havQoIq4wFvRk\n\
3MYtNn2mJ4nUGwKXLmur9exUpNvxcK8/L1tX4Hq0//Bv3i8A7wrEtdokQrfoNMW8\n\
RRXl3WQNdG1Nj5woK03zSkWJvErZ8oGGVQ+HOQI1bKVrJZH1l6yTJIl/9TQMCXaS\n\
+wIDAQAB\n\
-----END PUBLIC KEY-----";
unsigned char private_key[] = "-----BEGIN PRIVATE KEY-----\n\
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDaZdr/mHTlZXCom\n\
/rPdreN+T57zPu7dtjlT0QdD0FnWdUDDgFj9MJVBMDtqW9eHVU8PsWFLxDw2V5Gy\n\
rw+8TZS31GNA70LKzMp88aA6o8ZJXkncyoGszEviasfs6CNb1AbIv127DyV+ojMr\n\
LmsFVhvNFFue84R6YanPJVTxtPobj3EQee453Fp8fqxa8HFthiR5smvCziFq9Cgir\n\
gMW9GTcxi02faYnidlBsClcua6v17FSk2/Fwrz8vW1fgerT/8G/eLwDvCsS12iRC\n\
t+g0xbxFFeXdZAx0bU2PnCgrTfNKRYm8StnygYZVD4c5AjVspWtklknWXrJMkiX/\n\
1NAwJdpL7AgMBAAECggEBAI7fHjeos0P6xQhVUbkK1vzX3FJtBEH4sZOgRAwCEgb\n\
Lzm8bx2ueFVq9Y/Og34XOY8fbNX0UiVJQkNvxqPIvuM+nT5W5fmDDeYaQVbUUJ8M\n\
EX2B+PNW40SJ9Y0JY9LwLwzJV1Q9ZnJU/4g5W3le1Um4EJz+IMImhFwN5MgoLFR5\n\
P1gLY9OcHjZaIbhzb6cDkwCeeJ+9w4E5C7YVWuqQ2U9sSOmAmZPZzF0n7aRbxbNM\n\
96+o0zWUfj3loRyIVOLMl77ahiK1xvLkfSaf1dUqEMKyFuAotZgZrHk0uLiT9RbB\n\
8Z7pIzWrQpyfRmX9d8oV6Jzv3MDiB/2t0ILWxR4zjAECgYEA7kKtGqeSfaK3rJep\n\
YONxEZ2ZqNYv3T6hN+TId0BHfZrHzfNcAaWaG0lWkLhEbx6x4u8Qn7FF1D4e0VuK\n\
0lJzE6+e1KRZdQ7GdZ9Qy9yUJw5lZZQ3zHAD/k4w8XjJGsztd/y4VYP9OqroW34y\n\
zqPXpZGmK2+GWV72mPx5bLbJm0kCgYEA1XdJFYoqOvEtqMIDdsSGVNRYg1u8JDmR\n\
0wVHYj12yY2vOTjv3ScXJbgjcw/k4bJyDUO2NQ5eiFHfZ+h8dxFca3z9u9RtGk58\n\
Cop4eAKoO7dE6QJ76wNzJWvEo69t65v3OWlPfBZ/l2S5TgR9z7SHyHvWGZHReVTH\n\
m8hXKqXd4O0CgYEAzjvMgjDwFkJu2N+Z4X3sln1xj+Na/UCGZsfrkXYJYJwU6/DV\n\
LbZIiE1yz2Wp6dHFnqLvv8NFeMLeL83+4o25ZmJrSf6nWU9gtlZrBnn3ugAa7VcX\n\
pOY2u6DGFvQjgBTAiqUf21e2NQ8mRFEHjy2cm9b4j6X+jtfWqAG/w3cqNJECgYEA\n\
0a2edf6V8PCp5aYTAgoElkWpLBXe+RPuAmKx5fs/WoLrYEPOI9aX9LVroCfkOBLW\n\
/yZIfuO56SZ6M0JLxqj5Gk1f0qoJ8pBLmwNB0Tjy12mkw+rntnyoLdFD8ZHKfC1g\n\
pZ7GmZjUJbq0p9ojg8p10sQ7zwoO0vDraOawSLk1wY0CgYEAuQlW0OQCvO7UGvOV\n\
4JLjKMygQ6Nxoyb3nOwbfA7S6LXQKwSjQPWavMInmvn0+2UJ1eHLH9DSV9qTmglS\n\
/ZQMvVQ3cI5rZ7s21zJ9zs1bAF1CZS04rpGdU8jMnRz1CaA0ZB62mCjJen5g12Fk\n\
WdZtSvPWoE15cTwtpernsOc1Mg4=\n\
-----END PRIVATE KEY-----";
int len = strlen((char*)plaintext);
// 加密过程
unsigned char ciphertext[len];
int ret = rsa_encrypt(plaintext, len, public_key, ciphertext);
// 输出加密结果
cout << "ciphertext: ";
for (int i = 0; i < ret; ++i) {
printf("%02x ", ciphertext[i]);
}
cout << endl;
// 解密过程
unsigned char decryptedtext[len];
ret = rsa_decrypt(ciphertext, ret, private_key, decryptedtext);
// 输出解密结果
cout << "decryptedtext: ";
for (int i = 0; i < ret; ++i) {
printf("%c", decryptedtext[i]);
}
cout << endl;
return 0;
}