摘要

网上有很多关于RSA的解密脚本,欧拉函数、欧几里得函数什么的,对于一个大专生的我来说,一窍不通,至此经历了三天三夜,我翻阅了RSA的加密原理,以及其底层算法,专研出了一套我自己的解密算法,尚有不足,欢迎评论吐槽!

RSA算法原理

RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

RSA算法的具体描述如下:
(1)任意选取两个不同的大素数p和q计算乘积 n = pq,n1 = (p-1)(q-1) ;
(2)任意选取一个大整数e,满足gcd(e,n1)=1,整数e用做加密钥(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用);
(3)确定的解密钥d,满足(de) mod n1 = 1,即de = k(n1)+1,k >= 1 是一个任意的整数;所以,若知道e和n1,则很容易计算出d;
(4)公开整数n和e,秘密保存d ;
(5)将明文m(m<n是一个整数)加密成密文c,加密算法为:c = E(m)=m^e mod n;
(6)将密文c解密为明文m,解密算法为:m = D(c) = c^d mod n;
然而只根据n和e(注意:不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。

RSA解密算法思路

通过RSA算法原理的第三点可以看到,需要解密出 明文m,就要知道 密钥d,所以算法思路就围绕密钥d进行求解。

密钥d 通过 辗转相除法 (欧几里得算法,我后面才知道的......) 进行求解:

1、根据算法原理的第三点我们得知:(de) mod n1 = 1,即 de - k(n1) = 1;

2、知道 系数k 即可得到 密钥d,且 系数k 存在两种情况:

2.1 情况一:n1 != 1

2.1.1 先 n1 对 e 取模 后得到的值赋值给 n1

2.1.2 然后 e 对 赋值后的 n1 取模 得到的值赋值给 e

......

以此类推,最后得到 k = 1 时即可停止;

令 d = 1 代入倒数第二条式子,得到k的值代入倒数第三条式子,以此类推当代入至第一条式子时,得到的 d 即为 密钥d 的值;

2.2 情况二:n1 = 1

2.2.1 按照情况一的步骤,最后得到 n1 = 1 时即可停止;

根据情况一的步骤代入即可得到 密钥d 的值。

3、使用python内置函数 pow函数即可得到 明文m。

k的算法函数

 1 def rsa_k(p,q,e):
2 e1 = e
3 n1 = (p - 1) * (q - 1)
4 i = 0
5 n2 = []
6 e2 = []
7 n2.append(n1)
8 e2.append(e)
9 while True:
10 i += 1
11 n1 = n1%e1
12 n2.append(n1)
13 if n1 == 1:
14 if i == 1:
15 d1 = 1
16 k = (e1 * d1) - 1
17 break
18 else:
19 '''d * e - n1 * k = 1'''
20 # 最后一步 k = e - 1
21 k = (e2[i-1] * 1 - 1) / n2[i]
22 for j in range(i-1):
23 d1 = (1 + (k * n2[i - j - 1])) / e2[i - j - 1]
24 k = (e2[i - (j + 1) - 1] * d1 - 1) / n2[i - j - 1]
25 break
26 else:
27 e1 = e1 % n1
28 e2.append(e1)
29 if e1 == 1:
30 if i == 1:
31 d1 = 1
32 k = (e * d1 -1) / n1
33 break
34 else:
35 # k=0,d1=1 最后一步
36 # 倒数第二步开始,往前求d
37 # K != 1
38 '''d * e - n1 * k = 1'''
39 k = (e2[i-1] * 1 -1) / n2[i]
40 for j in range(i-1):
41 d1 = (1 + (k*n2[i-j-1])) / e2[i-j-1]
42 k = (e2[i-(j+1)-1] * d1 -1) / n2[i-j-1]
43 break
44 rsa_d(p,q,e,k)

密钥d的算法函数

1 def rsa_d(p,q,e,k):
2 n1 = (p - 1) * (q - 1)
3 # 第一步
4 # " / "就表示 浮点数除法,返回浮点结果;" // "表示整数除法
5 d = (1 + n1 * int(k)) // e
6 rsd_m(int(c),int(d),int(n))

明文m的算法函数

1 def rsd_m(c,d,n):
2 m = pow(c,d,n)
3 flag = long_to_bytes(m)
4 print('[+] 解密完成\nflag =',flag.decode('utf-8'))

源码已经放在github上,记得帮作者点一下Star哦~

声明

1、博客中标注原创的文章,版权归原作者 spmonkey 所有;
2、未经原作者允许不得转载本文内容,否则将视为侵权;
3、转载或者引用本文内容请注明来源及原作者;
4、对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

先联系原作者征得转载授权,并且注明文章原始出处和原作者。

联系原作者邮箱:spmonkey@hscsec.cn

基于python的RSA解密算法的更多相关文章

  1. Python常用加密解密算法

    MD5加密 简介 这是一种使用非常广泛的加密方式,不可逆的,常见16位和32位一般都是md5 实现 import hashlib data = '你好' print(hashlib.md5(data. ...

  2. javascript的rsa加密和python的rsa解密

    先说下目前测试情况:javascript加密后的数据,python无法完成解密,我估计是两者的加密解密方法不同 1.看了这篇文章:http://blog.nsfocus.net/python-js-e ...

  3. 基于Python的函数回归算法验证

    看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归回归方法就是寻找方差的最小值y = kx + bxi, yiy ...

  4. 基于OpenSLL的RSA加密应用(非算法)

    基于OpenSLL的RSA加密应用(非算法) iOS开发中的小伙伴应该是经常用der和p12进行加密解密,而且在通常加密不止一种加密算法,还可以加点儿盐吧~本文章主要阐述的是在iOS中基于openSL ...

  5. [转]RSA,DSA等加解密算法介绍

    From : http://blog.sina.com.cn/s/blog_a9303fd90101cgw4.html 1)      MD5/SHA MessageDigest是一个数据的数字指纹. ...

  6. C# 中使用 RSA加解密算法

    一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即 ...

  7. 基于OpenSSL的RSA加密应用(非算法)

    基于OpenSSL的RSA加密应用(非算法) iOS开发中的小伙伴应该是经常用der和p12进行加密解密,而且在通常加密不止一种加密算法,还可以加点儿盐吧~本文章主要阐述的是在iOS中基于openSL ...

  8. python实现RSA加密和签名以及分段加解密的方案

    1.前言 很多朋友在工作中,会遇到一些接口使用RSA加密和签名来处理的请求参数,那么遇到这个问题的时候,第一时间当然是找开发要加解密的方法,但是开发给加解密代码,大多数情况都是java,c++,js等 ...

  9. 使用Python 模拟RSA 加密与解密

    一.关于 RSA具体原理请移步其他文章,本文主要使用Python 来模拟RSA 算法的实现过程 二.简要分析 在RSA算法中,存在以下几个参数: 1.大素数p.q 2.n = p *q 3.Phi_n ...

随机推荐

  1. k8s的部署

    一.k8s的二进制部署 1.环境准备: IP                               节点 172.16.10.1         k8s-master01 172.16.10.3 ...

  2. 循环数组%操作下的一些解释(对于4.4UVA133的一些解释)

    1.循环数组一般不推荐通过建立相同的数组不断叠加来实现,虽然理论上是可行的,但是会浪费极大的空间,特别是对于大数据的情况下,程序一般会马上挂掉 2.循环数组的结构表示中的一种常用形式就是通过取余操作来 ...

  3. 推荐系统-协同过滤在Spark中的实现

    作者:vivo 互联网服务器团队-Tang Shutao 现如今推荐无处不在,例如抖音.淘宝.京东App均能见到推荐系统的身影,其背后涉及许多的技术.本文以经典的协同过滤为切入点,重点介绍了被工业界广 ...

  4. Kafka与Spark案例实践

    1.概述 Kafka系统的灵活多变,让它拥有丰富的拓展性,可以与第三方套件很方便的对接.例如,实时计算引擎Spark.接下来通过一个完整案例,运用Kafka和Spark来合理完成. 2.内容 2.1 ...

  5. Vue3系列2--项目目录介绍及运行项目

    1 Vite项目目录 用Vscode打开创建的项目,看到下面的目录结构: 通过运行  npm install 初始化项目后生成两个初始化文件:node_modules和 package-lock.js ...

  6. 趣味问题《寻人启事》的Python程序解决

    偷懒了很久,今天我终于又来更新博客了~ 最近,我看到了一个趣味问题,或者说是数学游戏:<寻人启事>. 在表述这个问题前,我们需要了解一下"冰雹猜想": 对于任意一个正整 ...

  7. 6.13 NOI 模拟

    \(T1\ first\) \(bitset\)字符串匹配 \(yyds\) \(O(\frac{n^2}{w})\)就是正解! #include<bits/stdc++.h> #defi ...

  8. CSP-J2021 题解

    分糖果 题意 选择L~R中的某个数 , 使得x mod k的结果最大. 思路 分两种情况考虑: 若 L 和 R 对 K 取模后在同一区间,则必然在 x=R 位置取到最大值: 否则 L~R 必然跨越多个 ...

  9. 《DevOps围炉夜话》- Pilot - CNCF开源DevOps项目DevStream简介 - feat. PMC成员胡涛

    本文作者:aFlyBird0 个人主页:https://blog.aflybird.cn/ 开门见山 这是<DevOps围炉夜话>系列节目的第一期.在这期首秀中,我们邀请到了 DevStr ...

  10. Python带我起飞——入门、进阶、商业实战_ 入门版电子书籍分享,

    Python带我起飞--入门.进阶.商业实战_ 免费下载地址 内容简介 · · · · · · <Python带我起飞--入门.进阶.商业实战>针对Python 3.5 以上版本,采用&q ...