rsa原理及其应用

rsa算法

0x01 原理

1.1 相关概念

RSA(Rivest-Shamir-Adleman)加密算法是一种基于数论的非实时加密算法,广泛用于安全通信。RSA算法的核心依赖于大整数分解的困难性

1.2 非对称加密

RSA是一种非加密加密算法,它使用公钥进行加密,私钥进行解密。非加密加密的优势在于,公钥可以公开(存储于公钥数据库PKDB),而私钥仅保留给接收者。这种设计使得消息安全传输,而消耗共享加密密钥。

1.3 素数(素数)

RSA依赖于两个大素数的乘积。素数是指只能被1和自身整除的整数。两个大素数的乘积积极难以进行因数分解,而这一问题构成了RSA的安全基础。

1.4 模运算(Modulo)

余数 RSA 中广泛使用模破坏。模破坏是一种余数破坏,定义为一个整数除以另一个整数后得到的数。在 RSA 中,模破坏对加密和解密过程的避免可以在有限的数值范围内进行,从而避免溢出和精度问题。

1.5欧几里得函数

给定两个非负整数 a 和 b(假设 a ≥ b),欧几里得算法基于以下原理:

  1. 如果 a = b,那么结果就是 a(或 b)。
  2. 如果 a = 0,那么结果是 b,反之亦然。
  3. 如果 a ≠ b,那么可以用较小的那个数去除较大的那个数,然后用余数代替较大的数,重复此步骤直到余数为 0。

欧几里得算法的步骤

  1. 计算 a mod b 得到余数 r。
  2. 如果 r = 0,那么 b 就是 a 和 b 的最大公约数。
  3. 如果 r ≠ 0,令 a = b,b = r,然后重复步骤 1。

示例

假设我们要找 48 和 18 的最大公约数:

  1. 48mod  18=1248mod18=12
  2. 18mod  12=618mod12=6
  3. 12mod  6=012mod6=0,此时余数为 0,所以最大公约数是 6。

扩展欧几里得算法

扩展欧几里得算法不仅可以找到 a 和 b 的最大公约数 d,还可以找到一对整数 x 和 y,使得 ax + by = d

1.6 欧拉函数φ(n)

欧拉函数(Euler's Totient Function),通常记作 φ(n),是数论中的一个重要函数。它对于一个正整数 n 定义为小于或等于 n 的正整数中与 n 互质的数的数目。两个数互质(coprime)指的是它们的最大公约数(GCD)为 1。

例如,φ(9) = 6,因为 1, 2, 4, 5, 7 和 8 与 9 互质;而 φ(8) = 4,因为只有 1, 3, 5 和 7 与 8 互质。

如果 n 是一个质数 p 的幂次 p^k,则有:

 φ(pk)=pk−pk−1=pk(1−1p)*φ*(*p**k*)=*p**k*−*p**k*−1=*p**k*(1−*p*1)

对于任意正整数 n,如果 n 可以分解为不同质数的乘积:

 n=p1k1⋅p2k2⋯pmkm*n*=*p*1*k*1⋅*p*2*k*2⋯*p**m**k**m*

那么根据欧拉函数的性质,我们可以计算出:

 φ(n)=φ(p1k1)⋅φ(p2k2)⋯φ(pmkm)*φ*(*n*)=*φ*(*p*1*k*1)⋅*φ*(*p*2*k*2)⋯*φ*(*p**m**k**m*) φ(n)=n⋅(1−1p1)⋅(1−1p2)⋯(1−1pm)*φ*(*n*)=*n*⋅(1−*p*11)⋅(1−*p*21)⋯(1−*p**m*1)

0x02 算法描述

1.1 密钥计算步骤

1、生成两个大素数p和q

2、计算两个素数的乘积

n=p*q 

3、计算欧拉函数

φ(n)=(p-1)*(q-1)

4、选择一个整数e(1 < e < φ(n)),使得eφ(n)互质(即最大公约数gcd(e, φ(n)) = 1)。通常情况下,e取一个较小的质数如65537 (2^16 + 1),因为它使得加密过程更高效。

5、欧几里得算法计算d(私钥)

d(1 < d < φ(n)),使得

(d * e) mod φ(n) = 1
d = e^-1 mod φ(n)

换句话说,de在模φ(n)下的乘法逆元

6、公钥:(n, e)组成

​ 私钥:(n, d)组成

7、加密

m(其中m必须小于n)使用公钥(n, e),加密公式为c = m^e mod n,这里c是密文

8、解密

c使用私钥(n, d),解密公式为m = c^d mod n,这样就恢复了原始的消息m

1.2 小结

公钥 (e,n)
私钥 (d,n)
密钥对 (e,n,d)
加密 c = m^e mod n
解密 m = c ^d mod n
n p*q
φ(n) (p-1)*(q-1)
e 1<e< φ(n)
d 1<d< φ(n) ,e*d mod φ(n) = 1

0x03 RSA算法的实现

RSA算法的实现涉及到大数的幂模运算,这在计算机编程中通常通过特定的算法来优化,如平方-乘法算法。以下是RSA算法的一个简化的Python实现示例:

import random
from math import gcd

def is_prime(num):
    """检查num是否为素数"""
    if num < 2:
        return False
    for factor in range(2, int(num ** 0.5) + 1):
        if num % factor == 0:
            return False
    return True

def generate_prime(start, end):
    """在[start, end]区间内生成一个素数"""
    prime = random.randint(start, end)
    while not is_prime(prime):
        prime = random.randint(start, end)
    return prime

def multiplicative_inverse(e, phi):
    """计算e相对于phi的模逆"""
    d = 1
    while d * e % phi != 1:
        d += 1
    return d

def generate_keypair(p, q):
    """生成公钥和私钥"""
    n = p * q
    phi = (p - 1) * (q - 1)
    
    # 选择e
    e = random.randrange(2, phi)
    g = gcd(e, phi)
    while g != 1:
        e = random.randrange(2, phi)
        g = gcd(e, phi)
        
    # 计算d
    d = multiplicative_inverse(e, phi)
    
    # 返回公钥和私钥
    return ((e, n), (d, n))

def encrypt_rsa(public_key, plaintext):
    """使用公钥public_key对明文plaintext进行加密"""
    e, n = public_key
    # 将每个汉字转换成Unicode码并加密
    encrypted = [pow(ord(char), e, n) for char in plaintext]
    return encrypted

def decrypt_rsa(private_key, ciphertext):
    """使用私钥private_key对密文ciphertext进行解密"""
    d, n = private_key
    # 对每个数字解密并转换回字符
    decrypted = [chr(pow(char, d, n)) for char in ciphertext]
    return ''.join(decrypted)

# 示例代码
if __name__ == '__main__':
    # 生成两个较小的素数(为了简化示例)
    p = generate_prime(65537, 65537 * 2)
    q = generate_prime(65537, 65537 * 2)
    
    # 生成公钥和私钥
    public, private = generate_keypair(p, q)
    
    # 中文明文
    message = "你好世界!"
    
    # 加密
    encrypted_msg = encrypt_rsa(public, message)
    print("加密后的消息:", encrypted_msg)
    
    # 解密
    decrypted_msg = decrypt_rsa(private, encrypted_msg)
    print("解密后的消息:", decrypted_msg)

0x04 安全性和应用

RSA算法的安全性取决于密钥的长度,目前推荐的密钥长度至少为2048位。RSA算法广泛应用于数字签名、安全通信等领域。然而,随着计算能力的提升和量子计算的发展,RSA算法的安全性面临挑战,因此密钥长度和算法的实现需要不断更新以保持安全。

rsa安全三种模式:

4.1 加密模式

公钥加密,私钥解密

发方:A先查PKDB,查到公开的公钥KeB——>A用KeB加密明文M——>得到密文:C=E(M,KeB)——>A发送密文C给B
收方:B接受C——>B用主机的私钥KdB解密密文C——>得到密文M=D(M,KdB)

4.2 认证模式

私钥加密,公钥解密

发方:A用主机的私钥KdA加密密文M——>得到密文C=E(M,KdA)
收方:B接受C——>B查PKDB——>查到A的KeA——>用KdA解密C——>得到明文M=D(C,KeA)

4.3机密认证混合模式

同时保证数据的秘密性和真实性

发方:A用自己的私钥KdD加密消息M——>得到中间密文S=E(M,KdA)——>A查询PKDB——>得到B的公钥KeB——>用公钥KeB加密S得到——>最终密文C=(M,KeB)——>A发送给B
收方:B接受C——>B用自己的私钥KdB解密密文C——>得到中级密文S=D(C,KdB)——> B查找PKDB找到A的公钥KeA——>解密消息S——>得到明文M=(S,KeA)

4.4 应用

  • RSA算法的应用包括但不限于以下几个方面:

    1. 数据加密
      • RSA可以用于保护数据在传输过程中的安全,比如在互联网上的通信。
      • 它被广泛应用于HTTPS协议中,确保网站与用户之间的通信安全。
    2. 数字签名
      • RSA还用于创建数字签名,这可以验证数据来源的真实性以及数据是否未被篡改。
      • 数字签名可以用来确认文件或电子文档的发布者身份,并保证文件的完整性。
    3. 密钥交换
      • 在一些场景下,RSA用于在通信双方之间安全地交换对称加密所需的密钥。
    4. 身份验证
      • RSA可用于实现身份验证机制,如在登录过程中使用公钥/私钥对来验证用户的身份。
    5. 软件保护
      • 软件开发商可能会使用RSA来保护他们的软件不受非法复制。
    6. 电子邮件加密
      • 使用PGP(Pretty Good Privacy)等协议时,RSA用于加密邮件内容或创建邮件签名。
    7. 其他安全协议
      • RSA也是许多其他安全协议的一部分,如TLS/SSL、SSH、IPsec等。

    RSA算法虽然强大,但由于其计算密集型的特点,在处理大量数据时可能效率较低。因此,在实际应用中,通常会结合使用RSA和其他更高效的对称加密算法。例如,使用RSA加密一个对称密钥,然后用这个对称密钥来加密实际的数据。这样既保证了数据的安全性,又提高了加密解密的速度。

posted @ 2024-10-17 16:57  有一大盒  阅读(73)  评论(0编辑  收藏  举报