对称加密与非对称加密原理及其代码实现

概述

对称加密和非对称加密是现代密码学中最基本的两种加密方式。它们在保护数据安全方面发挥着重要作用。在本文中,我们将深入了解这两种加密方式的工作原理、优缺点以及应用场景,并提供C++代码实例,帮助初学者理解这些概念。

一、对称加密

对称加密也被称为共享密钥加密,是一种将相同密钥用于加密和解密的加密方式。在对称加密中,加密和解密使用的是相同的密钥,因此需要确保密钥的安全性。

1. 工作原理

对称加密使用一个密钥来加密和解密数据。发送方使用该密钥对数据进行加密,接收方使用相同的密钥对数据进行解密。这种加密方式非常快速,因为它只需要一个密钥来加密和解密数据。

以下是对称加密的基本过程:

  • 发送方使用密钥对明文进行加密。
  • 发送方将加密后的数据发送给接收方。
  • 接收方使用相同的密钥对加密后的数据进行解密。

2. 优缺点

优点:

  • 加密和解密速度快。
  • 加密强度高,因为使用的是相同的密钥。
  • 适合用于大量数据的加密。

缺点:

  • 密钥管理困难,需要确保密钥的安全性。
  • 不适合用于跨网络的通信,因为需要将密钥传输给接收方。

3. 应用场景

对称加密广泛应用于保护本地数据的安全,例如:

  • 文件和文件夹加密
  • 数据库加密
  • 本地存储设备加密

以下是使用C++实现对称加密的示例代码:

#include <iostream>
#include <cstring>
#include <openssl/evp.h>

using namespace std;

void symmetric_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
                       unsigned char *iv, unsigned char *ciphertext) {
    EVP_CIPHER_CTX *ctx;

    int len;

    int ciphertext_len;

    ctx = EVP_CIPHER_CTX_new();

    EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);

    EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len);

    ciphertext_len = len;

    EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);

    ciphertext_len += len;

    EVP_CIPHER_CTX_free(ctx);
}

void symmetric_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
                       unsigned char *iv, unsigned char *plaintext) {
    EVP_CIPHER_CTX *ctx;

    int len;

    int plaintext_len;

    ctx = EVP_CIPHER_CTX_new();

    EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);

    EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);

    plaintext_len = len;

    EVP_DecryptFinal_ex(ctx, plaintext + len, &len);

    plaintext_len += len;

    EVP_CIPHER_CTX_free(ctx);
}

int main() {
    unsigned char key[] = "01234567890123456789012345678901";
    unsigned char iv[] = "0123456789012345";
    unsigned char plaintext[] = "Hello World!";
    unsigned char ciphertext[128];
    unsigned char decryptedtext[128];

    symmetric_encrypt(plaintext, strlen((char *) plaintext), key, iv, ciphertext);
    symmetric_decrypt(ciphertext, strlen((char *) ciphertext), key, iv, decryptedtext);

    cout << "Plaintext: " << plaintext << endl;
    cout << "Ciphertext: " << ciphertext << endl;
    cout << "Decrypted text: " << decryptedtext << endl;

    return 0;
}

二、非对称加密

非对称加密也被称为公钥加密,是一种使用不同的密钥进行加密和解密的加密方式。在非对称加密中,有两个相关联的密钥:公钥和私钥。公钥可以公开,而私钥必须保持机密。

1. 工作原理

非对称加密使用一对公钥和私钥来加密和解密数据。发送方使用接收方的公钥来加密数据,接收方使用自己的私钥来解密数据。这种加密方式比对称加密更安全,因为不需要共享相同的私钥。

以下是非对称加密的基本过程:

  • 接收方生成一对公钥和私钥。
  • 接收方将公钥发送给发送方。
  • 发送方使用接收方的公钥来加密数据。
  • 接收方使用自己的私钥来解密数据。

2. 优缺点

优点:

  • 更安全,因为不需要共享相同的私钥。
  • 不需要传输私钥。
  • 可以用于跨网络通信。

缺点:

  • 加解密速度较慢。
  • 加解密强度较低。

3. 应用场景

非对称加密广泛应用于网络通信中,例如:

  • SSL/TLS协议
  • 数字签名
  • SSH协议

以下是使用C++实现非对称加密的示例代码:

#include <iostream>
#include <cstring>
#include <openssl/rsa.h>
#include <openssl/pem.h>

using namespace std;

void asymmetric_encrypt(unsigned char *plaintext, int plaintext_len, RSA *key,
                        unsigned char *ciphertext) {
    int len = RSA_public_encrypt(plaintext_len, plaintext, ciphertext, key, RSA_PKCS1_PADDING);
}

void asymmetric_decrypt(unsigned char *ciphertext, int ciphertext_len, RSA *key,
                        unsigned char *plaintext) {
    int len = RSA_private_decrypt(ciphertext_len, ciphertext, plaintext, key, RSA_PKCS1_PADDING);
}

int main() {
    RSA *keypair = RSA_generate_key(2048, RSA_F4, NULL, NULL);

    unsigned char plaintext[] = "Hello World!";
    unsigned char ciphertext[256];
    unsigned char decryptedtext[256];

    asymmetric_encrypt(plaintext, strlen((char *) plaintext), keypair, ciphertext);
    asymmetric_decrypt(ciphertext, strlen((char *) ciphertext), keypair, decryptedtext);

    cout << "Plaintext: " << plaintext << endl;
    cout << "Ciphertext: " << ciphertext << endl;
    cout << "Decrypted text: " << decryptedtext << endl;

    return 0;
}

总结

本文介绍了对称加密和非对称加密的工作原理、优缺点以及应用场景,并提供了C++代码实例,帮助读者更好地理解这些概念。在实际应用中,应根据具体情况选择合适的加密方式来保护数据安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值