一.RSA简介

简要概括就两句话:公钥(e)加密,私钥(d)解密。

二.RSA过程

三.RSA各参数

  • p 和 q:两个大的质数,是另一个参数N的的两个因子。
  • N/n:大整数,可以称之为模数。
  • e 和 d:公钥和私钥,互为无反数的两个指数。
  • (N, e):公钥对,有N
  • (N, d):私钥对,也有N
  • c 和 m:密文和明文。
  • pow(x, y, z):效果等效pow(x, y)1 % z, 先计算x的y次方,如果存在另一个参数z,需要再对结果进行取模。
  • 密钥长度:n以二进制表示的的位数,例如密钥长度为512代表n用二进制表示的长度为512bit。

对于RSA加密算法,公钥(N, e)为公钥,可以任意公开,破解RSA最直接(亦或是暴力)的方法就是分解整数N,然后计算欧拉函数φ(n)=(p-1) * (q-1),再通过d * e ≡ 1 mod φ(N),即可计算出 d,然后就可以使用私钥(N, d)通过m = pow(c,d,N)解密明文。

四.数学知识

1.质数与互质数

一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为质数(素数);否则称为合数。
例如,15=3×5,所以15不是素数,13除了等于13×1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。
1不是质数,也不是合数
公约数只有1的两个数,叫做互质数。

2.同余定理

“≡”是数论中表示同余的符号
同余的定义如下:
给定一个正整数m,如果两个整数a和b满足a - b能被m整除,即(a - b) mod m = 0,那么就称整数a与b对模m同余,记作a ≡ b ( mod m),同时可成立a mod m = b。
注意,同余与模运算是不同的。
显然,有如下事实:
(1)若a≡0(mod m),则m|a;
(2)a≡b(mod m)等价于a与b分别用m去除,余数相同。

3.欧拉函数

任意给定正整数n,计算在小于等于n的正整数之中,有多少个与n构成互质关系?计算这个值的方法就叫做欧拉函数,以φ(n)表示.
例如:在1到8之中,与8形成互质关系的是1、3、5、7,所以φ(n)=φ(8)=4。
φ(n)=(p-1)(q-1)由来:
例如:和15互质的为1,2,4,7,8,11,13,14,将15分解成3,5且两者互质,故φ(n)=φ(15)=φ(3) * φ(5)=(3-1)* (5-1)=8

4.欧拉定理

如果两个正整数a和n两者互质,则n的欧拉函数φ(n)也可以下面的等式也成立:a^φ(n)≡1(mod n)。
也就是说,a的φ(n)次方被n除的余数为1。
这就是φ(n)与公钥e互质的原因

5.模反元素:
根据欧拉定理,有:
a^φ(n) = a × a^(φ(n)−1)≡1(mod n)

令b=a^(φ(n)−1),得:a×b≡1(mod n)

b就是a的模反元素 所以,如果两个正整数a和n互质,那么一定可以找到整数b使得ab-1被n整除,或者说ab被n除的余数是1
私钥d与公钥e的乘积d*e 减去1可以被φ(n)整除,或者说ed乘积除以φ(n)的余数为1。或者说de乘积与1对模φ(n)同余,这就是私钥的d加密原理

PS:利用两者乘积求n或由n反推p与q,通常n往往是一个 1024bit 的超大数,很难分解为两个质数。

脚本(n+e+c+p+q=m脚本):

import libnum
from Crypto.Util.number import long_to_bytesc = 0x6cd55a2bbb49dfd2831e34b76cb5bdfad34418a4be96180b618581e9b6319f86  #c:密文
n = 108539847268573990275234024354672437246525085076605516960320005722741589898641
#n = int("",16)
e = 65537
#e = int("",16)
q = 333360321402603178263879595968004169219
p = 325593180411801742356727264127253758939d = libnum.invmod(e, (p - 1) * (q - 1))
m = pow(c, d, n)   # m 的十进制形式
string = long_to_bytes(m)  # m:明文
print(string)  # 结果为 b‘ m ’ 的形式

五.题型/常识等

1.最简单情况是知道p、q和公钥e,求出私钥d。

脚本如下:

import gmpy2
p = gmpy2.mpz(18443)    #初始化大整数
q = gmpy2.mpz(49891)
e = gmpy2.mpz(19)
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)   #invert(x,m)返回y使得x * y == 1 modulo m,如果不存在y,则返回0
print("p=%s,q=%s,e=%s"%(p,q,e))
print("d is:\n%s"%d)

2.n较小时(256bit)可以rsatool或kali上yafu解密。

在线分解大素数:http://www.factordb.com/index.php

3.n较大时(大于768bit)只能爆破或利用在线网站, 这一类在线网站的原理是储存了部分n分解成功的的值。

4.由p,q,dp,dq,c求明文m的算法,其中涉及的数学知识:参考另一篇博客。

5.已知密文文件(flag.enc/cipher.bin/flag.b64)和公钥文件(pubkey.pem/key.pem/key.pub)求解明文 m:
1)利用rsatools工具:
语法:

python RsaCtfTool.py --publickey key.pem --uncipherfile cipher.bin

2)

6.已知c ,e,n(非常大),和 dp,dq,求解明文m(领航杯2019的一道题:EasyRSA或2019山东省赛“深思杯”中 被加密的消息 一题,两者类似。):

import gmpy2
import libnum
e=65537
n=16969752165509132627630266968748854330340701692125427619559836488350298234735571480353078614975580378467355952333755313935516513773552163392952656321490268452556604858966899956242107008410558657924344295651939297328007932245741660910510032969527598266270511004857674534802203387399678231880894252328431133224653544948661283777645985028207609526654816645155558915197745062569124587412378716049814040670665079480055644873470756602993387261939566958806296599782943460141582045150971031211218617091283284118573714029266331227327398724265170352646794068702789645980810005549376399535110820052472419846801809110186557162127
dp=1781625775291028870269685257521108090329543012728705467782546913951537642623621769246441122189948671374990946405164459867410646825591310622618379116284293794090970292165263334749393009999335413089903796624326168039618287078192646490488534062803960418790874890435529393047389228718835244370645215187358081805
c=0x6c78dcee37830f3ec4ab4989d40fbb595060b3fbc395d52ad26defc13372c1a3948c5388f4e450e46e016c7803133d6881e5efc3b90a4789448097c94124590b1e7949f2524d7edccd61a27691c18d090ac1f54643b563141306045417581e3b263f4ad2816136a48b106f3058b08e2a810f4ae8ef25916cc110b41ac8158ce69ecbe20fc60c1ddb20154c6646bc5142aefe47abf053a8ac949d5bc057bb18b191ad08070fe9ec5d76b1fceae685514532448c1b388b2d38e7241ac19c296e95e4e021a3a4015d909a1d53a2eb7fa86f6329f4e6c937f958be576c58fab4d9c9126999c99bb28718efc41a6f5db52b47942a2ddf21639f020b5489699cf22b46for i in range(1,65538):if (dp*e-1)%i == 0:if n%(((dp*e-1)//i)+1)==0:p=((dp*e-1)//i)+1q=n//(((dp*e-1)//i)+1)phi = (p-1)*(q-1)d = gmpy2.invert(e,phi)%phiprint(libnum.n2s(pow(c,d,n)))

7.公共模数攻击:【BUUCTF :RSA3】
适用于:使用相同的模数 N 、不同的私钥,加密同一明文消息。


exp:

from gmpy2 import invert
# 欧几里得算法
def egcd(a, b):if a == 0:return (b, 0, 1)else:g, y, x = egcd(b % a, a)return (g, x - (b // a) * y, y)def main():n = 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801c1 = 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361c2 = 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397e1 = 11187289e2 = 9647291s = egcd(e1, e2)s1 = s[1]s2 = s[2]# 求模反元素if s1<0:s1 = - s1c1 = invert(c1, n)elif s2<0:s2 = - s2c2 = invert(c2, n)m = pow(c1,s1,n)*pow(c2,s2,n) % nprint(m)if __name__ == '__main__':main()

8.已知n(非常大),e,d求p,q(无法直接 从n分解)

import random
from md5 import md5def gcd(a, b):if a < b:a, b = b, awhile b != 0:temp = a % ba = bb = tempreturn adef getpq(n,e,d):p = 1q = 1while p==1 and q==1:k = d * e - 1g = random.randint ( 0 , n )while p==1 and q==1 and k % 2 == 0:k /= 2y = pow(g,k,n)if y!=1 and gcd(y-1,n)>1:p = gcd(y-1,n)q = n/preturn p,qdef main():n = 16352578963372306131642407541567045533766691177138375676491913897592458965544068296813122740126583082006556217616296009516413202833698268845634497478988128850373221853516973259086845725813424850548682503827191121548693288763243619033224322698075987667531863213468223654181658012754897588147027437229269098246969811226129883327598021859724836993626315476699384610680857047403431430525708390695622848315322636785398223207468754197643541958599210127261345770914514670199047435085714403641469016212958361993969304545214061560160267760786482163373784437641808292654489343487613446165542988382687729593384887516272690654309e = 65537d = 9459928379973667430138068528059438139092368625339079253289560577985304435062213121398231875832264894458314629575455553485752685643743266654630829957442008775259776311585654014858165341757547284112061885158006881475740553532826576260839430343960738520822367975528644329172668877696208741007648370045520535298040161675407779239300466681615493892692265542290255408673533853011662134953869432632554008235340864803377610352438146264524770710345273439724107080190182918285547426166561803716644089414078389475072103315432638197578186106576626728869020366214077455194554930725576023274922741115941214789600089166754476449453p,q = getpq(n,e,d)print p print qprint "Flag: flag{%s}" %md5(str(p + q)).hexdigest()
if __name__ == '__main__':main()

9.利用公约数:


10.Roll按行加密(加密是按行进行的):
题目是这样的:

{920139713,19}
704796792
752211152
274704164
18414022
368270835
483295235
263072905
459788476
483295235
459788476
663551792
475206804
459788476
428313374
475206804
459788476
425392137
704796792
458265677
341524652
483295235
534149509
425392137
428313374
425392137
341524652
458265677
263072905
483295235
828509797
341524652
425392137
475206804
428313374
483295235
475206804
459788476

完全考猜测猜到n=920139713,e=19,以下每一列组成密文c。
思路是:分解n,得p,q 根据p,q 获得欧拉数,根据欧拉数 获得 d,根据d 获得m
参考write-up。

六、攻击方式

1.其实破解rsa最直接方法就是分解模数N得q、p,基本只适用于N较小的时候,不过为保证安全性大部分时候都很难解出来,参考:

RSA低加密指数e攻击(e很小或很大):最好参考这篇博客。


1)e=2:把密文c开平方求解
因为c≡m^e(mod n),所以相当于将明文m平方后得到的密文c,开根号即可。

2)小明文攻击,例题:

3)低指数攻击大多数出现在e很大的时候

可以直接github用工具:https://github.com/pablocelayes/rsa-wiener-attack

yafu工具使用
不能直接分解n,不能使用公约数分解n,可以尝试yafu。

在p,q的取值差异过大,或者p,q的取值过于相近的时候,Format方法与Pollard rho方法都可以很快将n分解成功。
此类分解方法有一个开源项目yafu将其自动化实现了,不论n的大小,只要p和q存在相差过大或者过近时,都可以通过yafu很快地分解成功。

4.模不互素(存在两个或更多模数 n 且N1和N2不互质):

适用情况:存在两个或更多模数 ,且gcd(N1,N2)!=1 也就是N1和N2不互质
适用于,n超级大,用 yafu 的factor分解不了 的情况。

5.低加密指数广播攻击(模数n、密文c不同,明文m、加密指数e相同)

如果选取的加密指数较低,并且使用了相同的加密指数给一个接受者的群发送相同的信息,那么可以进行广播攻击得到明文。

适用范围:模数n、密文c不同,明文m、加密指数e相同。

一般的话e=k ,k是题目给出的n和c的组数。


例题:Jarvis OJ -2018强网杯nextrsa-Level9

exp:

#!/usr/bin/python
#coding:utf-8import gmpy2
import time
def CRT(items):N = reduce(lambda x, y: x * y, (i[1] for i in items))result = 0for a, n in items:m = N / nd, r, s = gmpy2.gcdext(n, m)if d != 1: raise Exception("Input not pairwise co-prime")result += a * s * mreturn result % N, N
# 读入 e, n, c
e = 3
n = [8564529398597496052509875513481234511905571293608253591774352345237876733293108831203723008958367224489489969614656703455962549261315442327443089652074571708651505447379309166100331065440172781968875497386410667715026180057913363208450111095566219238303387888025161407043477291378931412269049849744457547932264137377411127192940332805452317547219248055802197050456726624516860024108642571703812719370387292166670300197241575461417648592309869669813374010765766544607691011957968652581504886331252936146901456910589102484807039294566703917033093028140452849747910537865958098720693569821256189593894121111357731919189L,12222166297277342805260668042066733749258843622057497574551492680820573970618063356710810891221670366396148862070530068431772630271300064517141331380959413811482890080103511756363920299387620181525172247384085449944650678616398890947062703879307721506228672839270493453501648644787019360131991056158375296484870723717496184332078521221915234959627683952251865227849249752415242124235776428944052873501045127442031423538183282845800971359590735184850648986263721823804859410866927117413289461014754456802566932965710529063515405296476007642849800772934170961993925017146017197762805148533435040675962332469643915192423L,5057224034499776793532654516178914954537547410664409403680432108569079856741764362023185604595829263918927121465578691201904227912897025244771553860102714429349163283510695391193774853323951653123109509215361937850724934183826508070404239791710229214063382081391564954935544392514769166830815475459218792639383796711824752291158895292103354274632470559179266550681095452239666165213986993496109747058314685303485222302144835490056402939133225003233112131275635419321982899965440912525225759368684717157077161771778903529280898069381899400305195745292409238361901176051346615633641550303346790420492393767770845418243L]
c = [20010971557789931948130798983030201950038450269144104532821030667924400788869920238579729514672630221804096063149106742412869966814701225466606392171030411339119559280790040322081104363393453503417465768386174002015870794567148694722215873094298859132439253412531445187990845476275251348800166731481176155530755581153710085966976765505591809596417849783597055650440598035159288091495453205698044687869932756053447012994409598155552263807571713982758132066319612777306466708222135510918174055647735727504029507503430288609410745159037684948343055275573269067165460711584845480188706531450367147105629493736100726092945L,19200052919818196558567528701224082155105852846109782021681848107226495293687021416871117444987923837810238872836818190457667509409714021669160815809413653880491792640346474248859559867743715715552372738909255050196638006472279364316678941257894898953088366861786500472095752890593521428325838148184891778283229870316694059734109045397448347320487605412988229047015174998893589731503114337273121463601984792339337970193596813660178636222764332155999993506914518600565394196792457144962180040786607335687020278442899146954126853580244264273526509238060494624980807993322975135366653181977147866567146492356137019414255L,1394721540127922627584993749596603212491913755865039994631041458882716953251760080638497574652888386411767951258467542002582418260315909190241131591474627765734174146981015346732559115044918706641616288474447294129332475081232268241201488455865700933615291016346552048997127415783072860387265063527874160016186183078384940312292521628077750464413013768765371508493304331719166196330883242895556903378707199640686499970367957552543041110199009425369612644492288765891769004579050802446992426813215932250347386859783813875543314196764160792696291742850356532493945652482643696238487389412404616537620013009141601852080L]data = zip(c, n)
x, n = CRT(data)
m = gmpy2.iroot(gmpy2.mpz(x), e)[0].digits()
print m

七.题型总结(待积累补充):

各题型解析,exp参考的:https://blog.csdn.net/huanghelouzi/article/details/82943615

  • 已知p、q、e求解d
  • 已知p、q、e、c求解明文
  • 已知c、n、e求解明文
  • 已知c、e,求解明文
  • 求解d

参考:
CTF —crypto —RSA原理及各种题型总结
CTF密码学中RSA学习以及总结
RSA算法原理(数学)
RSA加密算法详细解说
CTF中RSA套路
玩转RSA加密算法(一)

RSA算法总结(数学知识/CTF题型)相关推荐

  1. FE之DR之线性降维:PCA/白化、LDA算法的数学知识(协方差矩阵)、相关论文、算法骤、代码实现、案例应用等相关配图之详细攻略

    FE之DR之线性降维:PCA/白化.LDA算法的数学知识(协方差矩阵).相关论文.算法骤.代码实现.案例应用等相关配图之详细攻略 目录 PCA 1.PCA的数学知识 1.协方差矩阵计算 2.PCA算法 ...

  2. 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?

    https://www.toutiao.com/a6661754579887063566/ 根据<人工智能影响力报告>显示: 人工智能科学家主要毕业于清华大学.中国科学院.中国科技大学.麻 ...

  3. AES算法相关数学知识 - 素域学习

    在AES算法中的MixColumn层中会用到伽罗瓦域中的乘法运算,而伽罗瓦域的运算涉及一些数学知识如下: 素域 有限域有时也称伽罗瓦域,它指的是由有限个元素组成的集合,在这个集合内可以执行加.减.乘和 ...

  4. 算法基础课-数学知识

    数学知识 第四章 数学知识 数论 质数 约数 欧拉函数 欧拉定理与费马小定理 拓展欧几里得定理 裴蜀定理 中国剩余定理 快速幂 高斯消元 求组合数 卡特兰数 容斥原理 博弈论 Nim游戏 SG函数 第 ...

  5. 熬了几个通宵,终于把初中到大学的数学知识梳理完了(学习算法必备数学知识)

    作者简介:阿里巴巴高级技术专家,一直关注前端和机器学习邻域相关技术,在知乎和微信公众号的"全栈深入"分享深度硬核技术文章. 下面的基础数学知识涉及很多数学公式,这些公式编辑起来累S ...

  6. [杂记]对RSA算法的数学原理的一点思考

    转载于:https://www.cnblogs.com/CQBZOIer-zyy/p/9808041.html

  7. acwing算法基础课数学知识关于质数的笔记

    质数 1.质数和合数是针对所有大于1的 "自然数" 来定义的(所有小于等于1的数都不是质数). 2.所有小于等于1的整数既不是质数也不是合数. 3.质数和素数都是同一种性质,只是叫 ...

  8. 【算法,数学知识】曼哈顿距离

    关于曼哈顿距离,假设有两个点 那么曼哈顿距离就是: 这个曼哈顿距离是一个交叉信息项,也就是知道一个点,是无法求出这个值的.也就是需要 O(N ^ 2). 那么如何降低求的时间复杂度呢,曼哈顿距离有一个 ...

  9. 机器学习算法、深度学习算法涉及的数学知识

    微积分基础 导数的定义 左导数.右导数.可导函数 导数几何意义.物理意义 基本函数求导公式 四则运算法则 复合函数求导法则 神经网络激活函数的导函数求解 高阶导数 导数与函数单调性 极值定理 导数与函 ...

最新文章

  1. -----------最小生成树----------------
  2. jQuery 遍历 - slice() 方法
  3. curl 访问不到html_嵌入式工程师入门前后端系列1:访问一个网页
  4. 133_Power BI 报表服务器2020年1月版本更新亮点
  5. 怎么扩展磁盘_电脑怎么增加C盘空间 小白教你不花钱增加C盘空间
  6. Java面向对象——基础1 类及类的成员
  7. 艾宾浩斯记忆表格excel_考研干货 | 如何使用艾宾浩斯曲线帮助记忆知识
  8. linux得到低权shell,oracle低权限下获取shell
  9. linux mysql更改用户权限
  10. 全面分析RHCE7(红帽认证工程师)考试题目之 ----NFS文件共享 篇
  11. 《数据结构题集》2.12
  12. VoIP服务器曝重大漏洞,黑客可以绕过管理员身份
  13. 宠物网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  14. about 日问输入法
  15. 企业微信加密消息体_企业微信机器人怎么发消息?企业微信机器人可以定时发消息吗?...
  16. 截图/贴图神器—Snipaste,下载地址
  17. 微信功能升级:低调开卖全球上网卡 得罪群主进不了群
  18. 车辆前组合灯出口德国做的E-mark认证可以在其他国家使用吗?
  19. seaborn绘图基础介绍
  20. java 历遍 类_[Java] 遍历指定包名下所有的类(支持jar) | 学步园

热门文章

  1. oracle手工快照,oracle快照原理及如何实现生成快照
  2. asp recordset 教程
  3. Borg Maze最小生成树
  4. 正则表达式匹配也可以简单快速(下:实现部分)
  5. Hbuilder创建app,夜神模拟器调试
  6. AI之AutoML:Google AutoML(Google Cloud自动化机器学习平台库)的简介、安装、使用方法
  7. 使用伟福仿真器对IAR 8051生成的HEX文件进行仿真
  8. java代码中设置mysql时区_关于Java中的mysql时区问题详解
  9. [Aaronyang]谈谈2015年AY对WPF全面技术总结40多篇WPF,炫到没朋友的AYUI来了
  10. freeswitch 1.10版本 centos7安装