[密码学]对称加密-RSA算法

在这里插入图片描述

1. RSA算法用途


主要用于数据加密、数字签名、密钥交换、身份验证和数字证书等安全应用。

  • 理解RSA算法需要的数论基础包括质数、模运算、欧拉函数、模反函数。
  • 安全性依赖于大数的质因数分解困难性,目前尚未找到有效的算法能够快速分解大数。
  • 相对于对称加密来说,非对称加密算法的缺点是加密和解密的效率相对较低。

2. 加密方法


2.1.加密步骤

  1. 选择两个大素数p和q,并计算它们的乘积n: n = p * q
  2. 计算欧拉函数φ(n): φ(n) = (p - 1) * (q - 1)
  3. 选择一个整数e,使得1 < e < φ(n),且e与φ(n)互质: e称为公钥的指数。
  4. 计算e的模反函数d: 即找到一个整数d,使得(e * d) mod φ(n) = 1。d称为私钥的指数。
  5. 加密: 对于要加密的信息m,计算密文 c = m e   m o d   n c = m^e \ mod \ n c=me mod n
  6. 公钥(e, n)进行加密,私钥(d, n)用于解密

2.2.加密举例

  1. 假设我们选择的素数为p = 61,q = 53,那么n = p * q = 61 * 53 = 3233。
  2. 欧拉函数φ(n) = (p - 1) * (q - 1) = 60 * 52 = 3120
  3. 选择一个与φ(n)互质的整数e,这里我们选择e = 17。接下来需要计算e的模反函数d,使得(d * e) mod φ(n) = 1
  4. 通过扩展的欧几里得算法可以计算出d的值为d = 2753
  5. 假设我们要加密的信息为m = 123,加密过程为:
    c = m e m o d    n = 12 3 17 m o d    3233 = 855 c = m^e \mod n = 123^{17} \mod 3233 = 855 c=memodn=12317mod3233=855

3. 解密方法


3.1.解密步骤

使用私钥(d, n)对密文c进行解密: m = c d m o d    n m = c^d \mod n m=cdmodn

3.2.解密举例

m = 85 5 2753 m o d    3233 = 123 m = 855^{2753} \mod 3233 = 123 m=8552753mod3233=123

4. 基于非对称加密的应用


4.1.数字签名

RSA数字签名的过程如下:
1. 生成密钥对:与RSA加密相同,首先生成一对公钥和私钥。
2. 签名:假设要对消息M进行签名,签名者使用自己的私钥对消息进行签名。签名过程如下:
- 将消息M使用哈希函数(如SHA-256)进行哈希处理,得到消息摘要H(M)。
- 使用私钥对消息摘要H(M)进行加密,得到签名S,即 S = H(M)^d mod n,其中d是私钥的指数,n是私钥的模数。
3. 验证签名:验证者收到消息M和签名S后,使用签名者的公钥进行验证签名的真实性。验证过程如下:
- 使用公钥对签名S进行解密,得到解密后的消息摘要H'(M),即 H'(M) = S^e mod n,其中e是公钥的指数,n是公钥的模数。
- 将收到的消息M使用相同的哈希函数进行哈希处理,得到消息摘要H'(M)。
- 比较解密后的消息摘要H'(M)与哈希处理后的消息摘要H(M)是否相等,若相等则验证通过,否则验证失败。

4.2.密钥交换

1. 生成密钥对:Alice和Bob各自生成一对公钥和私钥。
2. 公钥交换:Alice和Bob将各自的公钥发送给对方。
3. 密钥协商:假设Alice想要向Bob发送加密消息。她从Bob收到的公钥加密一个会话密钥(对称密钥),然后将加密后的密钥发送给Bob。
4. 密钥解密:Bob收到Alice发送的加密会话密钥后,使用自己的私钥解密得到会话密钥。
5. 加密通信:Alice和Bob使用会话密钥进行加密和解密消息的通信。由于会话密钥是对称密钥,加密和解密的速度比使用公钥加密快得多。

4.3.身份验证

假设Alice想要验证Bob的身份。
1. Bob首先生成一对RSA密钥,包括公钥和私钥。Bob将自己的公钥发送给Alice。
2. Alice收到Bob的公钥后,使用该公钥对一条消息进行加密,并发送给Bob。
3. Bob收到加密后的消息后,使用自己的私钥对消息进行解密。
4. 如果解密后的消息与Alice发送的消息匹配,则Bob成功验证了自己的身份,因为只有Bob拥有自己的私钥才能解密该消息。

4.4.数字证书

1. 生成密钥对:首先,需要生成一对RSA密钥,包括一个私钥和一个公钥。私钥由证书颁发机构(CA)保存,并用于签署数字证书。公钥被包含在数字证书中,用于验证证书的真实性。

2. 创建证书请求:证书请求是包含有关实体(例如网站或个人)信息的文件,用于向CA请求数字证书。证书请求包括以下信息:
- 实体的公钥。
- 实体的信息,如名称、地址等。
- 证书的有效期限。

3. 证书颁发机构验证:CA接收到证书请求后,将验证实体的身份。这可能涉及到检查实体的身份证明文件或通过其他方式验证其身份。

4. 签署数字证书:如果实体的身份验证通过,CA将使用自己的私钥对数字证书进行签名。签名的过程通常包括以下步骤:
- 使用哈希函数对证书的内容进行哈希处理,得到消息摘要。
- 使用CA的私钥对消息摘要进行加密,生成数字签名。
- 将数字签名附加到证书中。

5. 颁发数字证书:CA颁发包含实体公钥和CA数字签名的数字证书。

6. 验证数字证书:实体收到数字证书后,可以使用CA的公钥对数字签名进行验证。验证的过程包括以下步骤:
- 使用CA的公钥对数字签名进行解密,得到消息摘要。
- 使用相同的哈希函数对证书的内容进行哈希处理,得到另一个消息摘要。
- 比较解密后的消息摘要和哈希处理后的消息摘要,如果相等,则证书有效。

5. 代码验证


仅供学习使用

import random

def gcd(a, b):
    # 辗转相除法求最大公约数
    while b != 0:
        a, b = b, a % b
    return a

def mod_inverse(a, m):
    # 求模反函数
    m0, x0, x1 = m, 0, 1
    while a > 1:
        q = a // m
        m, a = a % m, m
        x0, x1 = x1 - q * x0, x0
    return x1 + m0 if x1 < 0 else x1

def encrypt(public_key, message):
    # RSA加密算法
    e, n = public_key
    return pow(message, e, n)

def decrypt(private_key, cipher):
    # RSA解密算法
    d, n = private_key
    return pow(cipher, d, n)

# 设置明文m,公钥e,私钥d
m = 123
e = 17
p = 61
q = 53
n = p * q

# 生成密钥对
phi = (p - 1) * (q - 1)
d = mod_inverse(e, phi)
public_key = (e, n)
private_key = (d, n)

# 加密消息
cipher = encrypt(public_key, m)
print("明文m:", m)
print("p:", p)
print("q:", q)
print("e:", e)
print("n:", n)
print("密文:", cipher)

# 解密消息
decrypted_message = decrypt(private_key, cipher)
print("解密后的消息:", decrypted_message)
---
结果输出:
明文m: 123
p: 61
q: 53
n=p*q: 3233
e: 17
密文: 855
解密后的消息: 123

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值