易道云C语言/C++零基础到大神开发/QT/linux/实战项目/游戏学习笔记

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值