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. flex布局被内容被撑开及flex布局下定宽元素被压缩

    实现效果使用flex进行左右布局,左边定宽200px,右边自适应,当右边内容过多,造成右边盒子被撑开,会造成两种问题 左边定宽盒子被压缩解决办法: flex-grow:0;//是否自动增长空间 fle ...

  2. 记一次 .NET某环境监测系统 崩溃分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序崩溃了,也自己分析了下初步结果,让我帮忙再确认下,既然让我确认,那就开始dump分析之旅吧. 二:WinDbg 分析 1. 为什么会崩溃 wi ...

  3. List按需转换Map

    需求 : Mybatis的<select>返回一个List,想按照实体类其中的属性转换成Map<String, String>实现过程: 其实有很多方式,可以使用普通for循环 ...

  4. Layui Upload 多文件上传访问多次接口问题解决

    Layui 多文件上传访问多次接口 点我访问 LayUI框架官网 话不多数直接看源码 文件地址: layui/modules/upload.js // 通过each循环文件列表 layui.each( ...

  5. Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数

    1. 前言 很多朋友在调试驱动的时候,都会遇到这样一个场景: 修改一个参数,然后调用某个内核中的函数. 比如将某个gpio的值拉高/拉低,修改某个寄存器的值等等. 如果每一个参数都通过字符设备的ioc ...

  6. redis-cli命令行工具使用

    redis 6.2.8 1.连接 ./redis-cli -h 127.0.0.1 -p 6379 -a admin@2020 -h redis主机地址 -a redis密码 -p redis端口 2 ...

  7. 004.MinIO-DirectPV分布式存储部署

    MinIO部署介绍 部署概述 Kubernetes hostpath.local和本地静态配置都存在需要事先在node节点准备好可用的块存储或文件系统,例如对插入的硬盘,或者磁盘阵列做分区格式化,文件 ...

  8. python3实现url全编码/解码

    最近在学习SQL注入,绕过方法中有编码注入绕过,需要将关键词进行全编码,百度了一下没有找到全编码工具,所有的编码工具里"and"编码完还是"and",于是查了一 ...

  9. mybatis springboot多数据源,根据使用的数据库不同,执行不同的sql语句

    springboot 多数据源配置就不说了,百度太多的用例, 这里只说下在多数据源下切换执行sql逻辑 1.xml sql嵌套,通过<if>标签来判断,用的是mybatis自己sql动态拼 ...

  10. python学习教材选哪个

    python语言俨然成为当今最流行的国际语言,无论你是做AI的还是非AI,大家都在用python语言,各种平台也都开始支持python,现在连文科生都在学习python语言了,甚至很多表哥表姐的工作都 ...