Crypto-RSA算法

RSA:

1.算法描述:

(1)选一对不同且够大的素数p,q
(2)计算n=pq
(3)计算f(n)=(p-1)(q-1),p,q保密
(4)找个与f(n)互质的数,e1<e<f(n)
(5)计算d,使得d*e≡1 mod f(n)

≡是数论中表示同余的符号。
公式中,≡符号的左边必须和符号右边同余,即两边模运算结果相同
不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;
符号的左边d与e的乘积做模运算后的结果也必须等于1。
这就需要计算出d的值,让这个同余等式能够成立。

(6)公钥KU=(e,n),私钥KR=(d,n)。
(7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。
设密文为C,
则加密过程为:C≡Me(mod n)
(8)解密过程为:M≡Cd(mod n)

有了上面的RSA基础可以知道RSA中的
p: 第一个大素数
q: 第二个大素数
模数n: n = p*q
f(n)=(p-1)*(q-1)
公钥指数e: 与 f(n)互质, 且 1 < e < f(n)
私钥指数d: 满足e * d ≡ 1 (mod f(n))
公钥 = {n, e},一般公开
私钥 = {d, e}

密文=明文的E次方除以N取余数

E=Encryption(加密)
N=Number(数字)
所以:公钥=(E,N)

明文=密文的D次方除以N的余数

D=Decryption(解密)
所以:私钥=(D,N)
###  N=p*q  (俩大质数)
###  L=Lcm(p-1,q-1)  (中间过程中的数)
###  gcd=(E,L)=1   (E与L最大公约数=1)
###  E*D mod L=1 (E*L除以L的余数=1)

2.解题:

题一:(pqce)

源:buuctf-rsarsa

方法Ⅰ:

p =
9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q =
11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
d=56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
c =
83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

Use RSA to find the secret message

在这里插入图片描述

在这里插入图片描述得到D:

56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977

  1. 用Python环境(win+r,输入cmd,输入Python2或者Python) /* 因为有Python2,python3的环境 */
  2. ①代码
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
n = 114573516752272714750064227635008832737477859608443481000717283425702025029279291376859256856603741797722497252841363753834114679306784379319341824813349417007577541466886971550474580368413974382926969910999462429631003527365143148445405716553105750338796691010126879918594076915709977585368841428779903869581
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
flag=pow(c, d, n)
print(flag)

②代码:

#!/usr/bin/python
import gmpy2
 
p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q =  11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e =  65537
c =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
n = q*p
phi = (q-1) * (p-1)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c,d,n)
print(m)
方法Ⅱ:

学习RSAtool2的使用:

1.Number Base 设置为十进制

2.注意:Public Exponent这里要使用16进制的数,如果公钥e=17的话,就应该填入十六进制的11

3.给出p,q,e的话直接填入,再点击Calc.D,获得d

4.给出的是n和e的话,输入n和e,点击Factor N(分解),得到p,q,再重复第3步就能得到d了

工具中的e65537要转成十六进制10001

然后再用python函数pow()即可求出flag

M = pow(C,d,n)    #快速求幂取模运算

print(M)

buuctf-RSA:(pqe)

题目:
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flag提交

解题

利用工具:

在这里插入图片描述
求出d
题目三:(pqce)
源:G1itch-RSA
题目:

2^16+1
p = 1619457011962613889034092691100138481201392787160018861588882624360276930879984504721332613
q = 1930644580807360024179365101463872960800671765127817730222044332809690977077925368011467259
c = 591746946043509417154408651370020140882201187961060440894988228260125420535482616849793702495189458033191552493861512032310747532849126740960428065188251472016781567743780417376053

利用RSAtool
在这里插入图片描述d=282465615276563040081497973595549857788146309975080032793709254291441593209360198444114432827219700106928284122876273688064794480258663235512816851680160190236609060383273992683295427524241801788740189903764974847338559875531097243379661562017591581726354417289537
代码:

e = 65537
p = 1619457011962613889034092691100138481201392787160018861588882624360276930879984504721332613
q = 1930644580807360024179365101463872960800671765127817730222044332809690977077925368011467259
n = p*q
#密文
C = 591746946043509417154408651370020140882201187961060440894988228260125420535482616849793702495189458033191552493861512032310747532849126740960428065188251472016781567743780417376053
d = 282465615276563040081497973595549857788146309975080032793709254291441593209360198444114432827219700106928284122876273688064794480258663235512816851680160190236609060383273992683295427524241801788740189903764974847338559875531097243379661562017591581726354417289537

#求明文
M = pow(C,d,n)    #快速求幂取模运算
print(M)

解得:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值