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加密一个对称密钥,然后用这个对称密钥来加密实际的数据。这样既保证了数据的安全性,又提高了加密解密的速度。

rsa原理及其应用的更多相关文章

  1. RSA原理及生成步骤

    摘自:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html(可到原网址查看秘钥生成原理) RSA算法原理(一) 因为它是 ...

  2. RSA原理、ssl认证、Tomcat中配置数字证书以及网络传输数据中的密码学知识

      情形一:接口的加.解密与加.验签 rsa不是只有加密解密,除此外还有加签和验签.之前一直误以为加密就是加签,解密就是验签.这是错误的! 正确的理解是: 数据传输的机密性:公钥加密私钥解密是密送,保 ...

  3. RSA - 原理、特点(加解密及签名验签)及公钥和私钥的生成

    Wiki - RSA加密演算法 Wiki - 欧拉函数 Wiki - 模反元素 ASN.1 格式标准 RSA算法原理(二) 注意: RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BAS ...

  4. RSA原理说明

    长度,建议至少1024.模数n(常取默认65537)两边都要用. 指数e,和n一起就是公钥. 指数d,和n一起就是私钥. 质数p和q用于生成密钥对,然后就丢弃不公开. 一.密钥对的生成步骤 1.随机选 ...

  5. 转: RSA原理 阮一峰的博客

    转:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 讲的非常细致,易懂.

  6. 数字签名中公钥和私钥是什么?对称加密与非对称加密,以及RSA的原理

    http://baijiahao.baidu.com/s?id=1581684919791448393&wfr=spider&for=pc https://blog.csdn.net/ ...

  7. (转)对称加密与非对称加密,以及RSA的原理

    一 概述 二对称加密和非对称加密 对称加密 非对称加密 区别 三RSA原理 整数运算 同余运算 当模数为合数n时 当模数为质数p的时候 离散对数问题 RSA原理 一 , 概述 在现代密码学诞生以前,就 ...

  8. Windows phone应用开发[19]-RSA数据加密

    在这个系列的第十六章节中Windows phone应用开发[16]-数据加密 中曾详细讲解过windows phone 常用的MD5,HMAC_MD5,DES,TripleDES[3DES] 数据加密 ...

  9. RSA算法详解

    1.RSA加密算法是最常用的非对称加密算法 2.RSARSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名, 3.目前学术界无法证明RS ...

  10. RSA加解密算法以及密钥格式

    RSA算法: 有个文章关于RSA原理讲的不错: https://blog.csdn.net/dbs1215/article/details/48953589 http://www.ruanyifeng ...

随机推荐

  1. MindSpore框架 加载文本数据集 示例

    代码原地址: https://www.mindspore.cn/tutorial/training/zh-CN/r1.2/use/load_dataset_text.html ============ ...

  2. Inno Setup 出现 the drive or unc share you selected does not exist or is not accessible 解决记录

    背景 软件是使用Inno Setup的,且安装后,再次安装是默认安装到历史路径.一次用户电脑维修后,发现再次安装后报错 解决办法 取消自动安装到默认路径就好了~ UsePreviousAppDir=n ...

  3. Sentry For Vue 完整接入详解(2021 Sentry v21.8.x)前方高能预警!三万字,慎入!

    内容源于:https://docs.sentry.io/platforms/javascript/guides/vue/ 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创 ...

  4. 根据域名获取IP

    /*************************************************************************************************** ...

  5. SMU Summer 2024 Contest Round 3

    SMU Summer 2024 Contest Round 3 寻找素数对 题意 给你一个偶数,找到两个最接近的素数,其和等于该偶数. 思路 处理出 1e5 以内的素数,然后遍历,更新最接近的答案. ...

  6. 神经网络之卷积篇:详解三维卷积(Convolutions over volumes)

    详解三维卷积 从一个例子开始,假如说不仅想检测灰度图像的特征,也想检测RGB彩色图像的特征.彩色图像如果是6×6×3,这里的3指的是三个颜色通道,可以把它想象成三个6×6图像的堆叠.为了检测图像的边缘 ...

  7. Linux库概念,动态库和静态库的制作,如何移植第三方库

    一.什么是库? 在windows平台和linux平台下都大量存在着库.一般是软件作者为了发布方便.替换方便或二次开发目的,而发布的一组可以单独与应用程序进行compile time或runtime链接 ...

  8. 使用SiliconCloud快速体验SimpleRAG(手把手教程)

    SiliconCloud介绍 SiliconCloud 基于优秀的开源基础模型,提供高性价比的 GenAI 服务. 不同于多数大模型云服务平台只提供自家大模型 API,SiliconCloud上架了包 ...

  9. 使用 iRingo 解锁本该属于你的苹果服务

    为什么别人的 Spotlight 可以通过航班号查询航班信息,而我的不行?为什么别人的 Spotlight 可以直接看英超联赛的比分信息?为什么我的 Apple News 打不开?这其实是因为这些功能 ...

  10. 【YashanDB知识库】绑定参数,同一个sql多个执行计划的问题

    问题现象 同一个sql有两个执行计划,是否合理? 它的EXECUTIONS,ELAPSED_TIME等统计信息怎么看,是独立分开的还是统一计算的? 如下图: 问题影响版本 tpcc测试:23.2.1. ...