RSA加密流程

RSA加密流程

A前端、B后端
A->B

  1. A提取消息m的消息摘要h(m),并使用自己的私钥对摘要h(m)进行加密,生成签名s
  2. A将签名s和消息m一起,使用B的公钥进行加密,生成密文c,发送给B

B

  1. B接收到密文c,使用自己的私钥解密c得到明文m和数字签名s
  2. B使用A的公钥解密数字签名s解密得到H(m)
  3. B使用相同的方法提取消息m的消息摘要h(m)
  4. B比较两个消息摘要。相同则验证成功;不同则验证失败

RSA 是一种 **非对称加密算法**,其核心思想是使用一对密钥:**公钥(public key)用于加密数据**,**私钥(private key)用于解密数据**。这种机制使得通信双方无需共享密钥即可安全地传输信息。 --- ## 一、RSA 加密流程详解 ### 1. 密钥生成 - **选择两个大素数** $ p $ 和 $ q $ - 计算模数 $ n = p \times q $ - 计算欧拉函数 $ \phi(n) = (p - 1)(q - 1) $ - 选择一个整数 $ e $,满足 $ 1 < e < \phi(n) $,且 $ \gcd(e, \phi(n)) = 1 $ - 计算 $ d $,使得 $ d \cdot e \equiv 1 \mod \phi(n) $ 最终: - 公钥为 $ (n, e) $ - 私钥为 $ (n, d) $ ### 2. 加密过程 给定明文 $ m $,满足 $ 0 \le m < n $,加密公式为: $$ c = m^e \mod n $$ 其中 $ c $ 是密文。 ### 3. 解密过程 给定密文 $ c $,解密公式为: $$ m = c^d \mod n $$ --- ## 二、Python 示例代码(使用 `PyCryptodome`) ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP import binascii # 1. 生成 RSA 密钥对 key = RSA.generate(2048) private_key = key.export_key() public_key = key.publickey().export_key() print("私钥:\n", private_key.decode()) print("公钥:\n", public_key.decode()) # 2. 使用公钥加密数据 def rsa_encrypt(plaintext, pub_key): rsa_key = RSA.import_key(pub_key) cipher_rsa = PKCS1_OAEP.new(rsa_key) ciphertext = cipher_rsa.encrypt(plaintext.encode('utf-8')) return ciphertext # 3. 使用私钥解密数据 def rsa_decrypt(ciphertext, priv_key): rsa_key = RSA.import_key(priv_key) cipher_rsa = PKCS1_OAEP.new(rsa_key) plaintext = cipher_rsa.decrypt(ciphertext) return plaintext.decode('utf-8') # 测试 message = "Hello, this is a secret message." encrypted = rsa_encrypt(message, public_key) print("加密后的数据:", binascii.hexlify(encrypted)) decrypted = rsa_decrypt(encrypted, private_key) print("解密后的数据:", decrypted) ``` --- ## 三、输出示例 ``` 私钥: -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- 公钥: -----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY----- 加密后的数据: b'1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a' 解密后的数据: Hello, this is a secret message. ``` --- ## 四、解释代码逻辑 | 功能 | 描述 | |------|------| | `RSA.generate(2048)` | 生成 2048 位的 RSA 密钥对 | | `PKCS1_OAEP.new()` | 使用 OAEP 填充方案进行加密,增强安全性 | | `encrypt()` | 使用公钥加密明文 | | `decrypt()` | 使用私钥解密密文 | --- ## 五、实际部署建议(嵌入式设备如 STM32 / ESP32) 在资源受限的嵌入式系统中,可以使用轻量级库实现 RSA: - **Mbed TLS(原 PolarSSL)** - **wolfSSL** - **TinyCrypt** 例如使用 Mbed TLS 实现 RSA 加密: ```c #include "mbedtls/rsa.h" #include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" // 初始化熵源和随机数生成器 mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_entropy_init(&entropy); mbedtls_ctr_drbg_init(&ctr_drbg); mbedtls_ctr_drbg_seed(&entropy, mbedtls_entropy_func, NULL, NULL, 0); // 初始化 RSA 上下文 mbedtls_rsa_context rsa; mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256); mbedtls_rsa_gen_key(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, 2048, 65537); // 加密与解密操作省略(可参考官方文档) ``` --- ## 六、应用场景 | 场景 | 描述 | |------|------| | 安全通信 | HTTPS、SSH 等协议中的密钥交换 | | 数字签名 | 保证文件完整性与身份认证 | | 身份认证 | NFC 标签中存储签名数据,主控验证合法性 | | IoT 设备配对 | 使用 RSA 进行设备间安全绑定 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值