rsa加密初探
RSA加密算法初探
RSA加密算法是早期的非对称加密,公钥和私钥分离,公开公钥,通过确保私钥的安全来保证加密内容的安全。由麻省理工学院的罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的,所以算法由他们三人的姓名首字母来命名。
有关RSA加密算法原理以及应用的文章在网上有很多,CTF中,RSA在密码学,misc以及逆向中考察得也很频繁(有些题目中好像也会出现RSA的魔改版本~Orz)。这里是我个人在学习RSA加密算法中的一点梳理和总结,主要从数学原理、加密原理以及RSA加密算法攻击层面的常见手段出发,剖析RSA加密。
一、数学原理
从数学层面理解RSA加密算法的核心,在于对于欧拉函数和模反运算的理解。
1、欧拉函数
对于一个正整数n,我们要计算小于n的正整数中,有多少和n互质(即和n只有一个公约数1),我们通过欧拉函数来计算。
(1)当n=1时,则 φ(1) = 1;
(2)当n是一个质数时,φ(n)=n-1,因为质数本身只有1和它本身两个约数,所以质数和小于它的任何正整数都互质;
(3)当n是一个质数的k次方时,即n=p^k(p为质数,k为大于等于1的整数),则φ(n)=p^k-p^(k-1),可以看到,k=1的时候,第2种情况就是第3种的特殊情况;
(4)欧拉函数是一个积性函数,即如果n可以分解成两个互质的整数之积,即n = p1 × p2,这时候φ(n) = φ(p1p2) = φ(p1)φ(p2);
(5)n可以写成一系列质数的积的形式,φ(n)=n(1-1/p1)(1-1/p2)…(1-1/pr),p1,p2…pr分别表示n可以被分解的最小质数。这个公式是欧拉函数的通用计算公式。
2、欧拉定理
欧拉定理是费马小定理的一般化,费马小定理有如下描述。
假如a是一个整数,p是一个质数,那么a^p-a是p的倍数,可以表示为:
a^p-a=kp(k为整数),即可表示为:
a^p≡a (mod p),当a是p的倍数时,a^p≡a(mod p)=0。当a不是p的倍数时,可写作a^(p-1)≡1(mod p)。
欧拉给予费马小定理以一般化(膜真神):欧拉定理表明,两个正整数a,n,在a和n互质的情况下(即gcd(a,n)=1),a^φ(n)≡1 (mod φ(n))。
3、模反运算
举个例子,对于ed≡1 (mod φ(n)),要求出d的值。上式等价于:ed-1=kφ(n),k为整数。这时候,模反运算就可以等价为一个二元一次方程。求解二元一次方程的过程,这里也分析一下。
要求出d,需要用到拓展欧几里得算法。在了解拓展欧几里得算法之前,首先要看一下贝祖定理。
贝祖定理:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 (x,y) ,使得 gcd(a,b)=ax+by。
拓展欧几里得算法,我们可以通过一个例子来看一下。求解不定方程:17x+3120y=1。
观察可得,17和3120互质,这个方程满足贝祖等式,我们这里通过辗转相除法计算:
(1)3120=18317+9
(2)17=9+8
(3)9=8+1
求得1为最大公约数,然后移项
(1)9=3120+183(-17)
(2)8=17+9(-1)
(3)1=9+8(-1)
接着用(2)式中的8=17+9(-1)替换掉三式中的”8”,依次类推:
(1)1=9+[17+9(-1)](-1)
(2)1=92+17(-1)
(3)1=[3120+183(-17)]2+17(-1)
(4)1=31202+17(-367)
那么最后求得的x=-367,y=2。
对于互质的整数a,b而言,贝祖等式可以写为a^x+b^y=1。二元一次方程是一个不定方程,所以需要找到一组解(x0,y0),然后用(x0,y0)去表示一组解的通解。
二、RSA加密原理
1、公钥私钥产生和分配
(1)进行加密之前,首先找出2个不同的大质数p和q;
(2)计算n=p*q,这里在选取p和q的时候,应该注意几点:p和q不能选取的太近,我们一般取同一数量级之中,差比较大的两个数;
(3)根据欧拉函数,求得φ(n)=φ(p)φ(q)=(p-1)(q-1);
(4)找出一个公钥e,e要满足:1<e<φ(n)的整数,且使e和φ(n)互质;
(5)根据e*d除以φ(n)余数为1,找到私钥d,这里求d,就是求一个模反运算,可以通过拓展欧几里得算法来计算;
(6)公钥就是(n,e),私钥就是(n,d)
2、加解密
m为密文,c为明文,这里的密文和明文都是数字的形式,对于字符串来说,可以取ascll码和unicode码。
RSA加密:m^e ≡ c (mod n)
RSA解密:c^d ≡ m (mod n)
RSA算法的安全性在于:已知公钥e和质数乘积n,要通过模反运算计算出私钥,需要计算出φ(n),由上文提到的欧拉函数计算的第三条可以得到φ(n)
=(q-1)(p-1),计算φ(n)需要得到质数q和p。你可以通过质数q和p来计算出n,但是要将n进行因数分解是非常困难的。所以,在选取的n足够大的情况下,要进行因数分解是一件非常困难的方法。未来要进行高于1024个二进制位私钥的破解,可能只有两种思路:足够强大的计算力,数学领域能够在因数分解方面提出全新的方法。所以截止目前为止,对于RSA加密算法来说,没有足够有效的方法进行破解。
RSA目前人类分解的最大整数是232个十进制位,768个二进制位。所以,一般在加密过程中使用1024个二进制位的密钥,在对安全性要求很高的情况下,使用2048个二进制位的密钥,我们认为这是绝对安全的。
CTF中的RSA
CTF中对于RSA的考察相当地频繁,水平有限,这里以我个人学习经历,总结几种比较常见的攻击手段。
模数分解
工业界常用到的RSA加密是1024或者2048个二进制位的密钥。但是在题目中,常常给出256位的密钥。这时候,我们可以利用一些工具直接对n进行分解,得到p,q,然后通过题目中给出的(n,e),密文m,利用拓展欧几里得算法来计算出私钥d,求出明文。这也是最基础的考察方式。
低加密指数攻击
m^e≡c(mod φ(n)),当e==2或e==3,且明文较小时,m^3=nk+c,这时候可以爆破一下k的值,然后对nk+c求解立方根。这种题目,很多时候需要多线程跑一下,也可以用现成的一些工具,前段时间CYBRICS CTF就有这样一道题目。
模不互素
模不互素攻击,需要满足以下条件:
1、有两个或者以上的模数,且模数之间不互素,即存在最大公约数;
2、对两段明文进行加密时,选取了相同的e来求解d;
模不互素,通过辗转相除法求解两个模数的公约数,这时候就可以成功分解两个质数q和p,这时候再要对密文进行求解,就非常简单了。
RSA共模攻击
共模攻击的条件:题目给出两对公钥(n,e1),(n,e2),且n1,n2互质,给出分别由两对秘钥加密的两组密文m1,m2。
这时候我们已知的条件是:e1,e2,m1,m2,n。
由于e1,e2互质,由贝祖定理可得:e1s1+e2s2=1。s1和s2可以由拓展欧几里得算法得知。这时候明文m满足条件:m=(c1^s1)*(c2^s2)%n。由此可以解得明文。
RoarCTF:EZRSA
from Crypto.Util.number import *
from gmpy2 import *
from secret import * assert(flag.startwith('flag{')) and (flag.endwith('}'))
assert(is_prime(beta) and len(bin(beta)[2:]) == 512)
assert(len(bin(x)[2:]) == len(bin(y)[2:]))
# This is tip!!!
assert(tip == 2*x*y*beta + x + y) p = 2*x*beta + 1
q = 2*y*beta + 1 assert(is_prime(p) and is_prime(q)) n = p*q
e = 65537
m = bytes_to_long(flag)
enc = powmod(m,e,n)
给出了算法和提示,公钥和密文也给出来了,tip可以用一下表达式来求解:
tip=(n-1)/(2*beta)
如果能够求解出x和y的话,也就可以算出p和q,算出p和q的话,就可以求出N=(p-1)*(q-1)的值。然后通过拓展欧几里得算法就可以求出私钥(n,d),然后通过d实现对密文的解密。
rsa加密初探的更多相关文章
- “不给力啊,老湿!”:RSA加密与破解
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 加密和解密是自古就有技术了.经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫 ...
- .NET 对接JAVA 使用Modulus,Exponent RSA 加密
最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs. ...
- Android数据加密之Rsa加密
前言: 最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- RSA加密例子和中途遇到的问题
在进行RSA加密例子 package test; import java.io.IOException; import java.security.Key; import java.security. ...
- iOS中RSA加密详解
先贴出代码的地址,做个说明,因为RSA加密在iOS的代码比较少,网上开源的也很少,最多的才8个星星.使用过程中发现有错误.然后我做了修正,和另一个库进行了整合,然后将其支持CocoaPod. http ...
- iOS动态部署之RSA加密传输Patch补丁
概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...
- Java使用RSA加密解密及签名校验
该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行 ...
- 基于OpenSLL的RSA加密应用(非算法)
基于OpenSLL的RSA加密应用(非算法) iOS开发中的小伙伴应该是经常用der和p12进行加密解密,而且在通常加密不止一种加密算法,还可以加点儿盐吧~本文章主要阐述的是在iOS中基于openSL ...
随机推荐
- Kali下切换JDK版本
Kali下自由更换JDK版本 今天在学习了一下CobaltStrike之后,打算在Kali上本地搭建一个服务器端, 查看了一下Kali的JDK配置发现版本是13.X的,然而CobaltStrike最好 ...
- centos8添加中文语言包
centos8添加中文语言包 系统:centos8 查看: [root@centos8]# locale -a 不支持中文包,按照centos7的方式安装:yum install kde-l10n-C ...
- actviti7撤回操作
@Override @Transactional(rollbackFor = Exception.class) public int callBack(String processId) { //通过 ...
- SpringMVC(8)国际化
在SpringMVC(七)格式化显示中我们讲了数据的格式化显示,Spring在做格式化展示的时候已经做了国际化处理,那么如何将我们网站的其它内容(如菜单.标题等)做国际化处理呢?这就是本篇要将的内容- ...
- 关于Feign的Fallback处理
Feign的不恰当的fallback Feign的坑不少,特别与Hystrix集成之后. 在微服务引入Feign后,上线不久后便发现,对于一个简单的查询类调用,在下游返回正常的"404-资源 ...
- vsftpd配置文件详解(转)
vsftpd配置文件详解 1.默认配置: 1>允许匿名用户和本地用户登陆. anonymous_enable=YES local_enable=YES 2> ...
- webpack(10)webpack-dev-server搭建本地服务器
前言 当我们使用webpack打包时,发现每次更新了一点代码,都需要重新打包,这样很麻烦,我们希望本地能搭建一个服务器,然后写入新的代码能够自动检测出来,这时候就需要用到webpack-dev-ser ...
- nmon打开nmon文件出现 运行时错误13类型不匹配问题解决
根据nmon工具安装及nmon analyser的使用 - 空谷幽兰LDD - 博客园 (cnblogs.com)文中,用nmon_analyse去打开监控到的nmon文件,出几个报错. 1 用WPS ...
- Maven项目导入Intellij IDEA
目录 1. 自动创建maven项目 2. 修改IDEA默认远程仓库,提高依赖包下载速度 3. 修改IDEA中maven设置 4. 将maven项目导入IDEA 坑:IDEA无法下载依赖包 1. 自动创 ...
- echarts堆叠柱状图在最上面的柱子显示总和
需求 柱子需设置barMinHeight 在堆叠柱状图的最上面显示当前堆叠的总和 直接上代码吧 需要注意:设置barMinHeight时为了让0不显示,只能将0设置为null; 设置为null的柱子l ...