CTF-RSA 数论解题记一:2019-AceBear-babyRSA

前言

最近一直跟着师傅们打比赛,学到了不少东西。看了看近期的几场比赛,虽然RSA的题越来越少了,但每场比赛都有,正好最近老遇见考LaXeT公式的题目,感觉公式写出来还挺好看,所以想试着利用LaXeT公式来写一下RSA类题目的推导过程,一方面提高下自己的基础数论水平,另外也磨练一下编写LaXeT公式的能力。借助网上一些RSA的题目,将具体的数论推导过程记录一下,有些基础,大佬请绕道。

2019-AceBear Security Contest-babyRSA

题目:

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)

p = getPrime(512)
q = getPrime(512)
n = p*q
e = 65537

c = pow(m, e, n)

print(n)
# 132991872691788324082134861997953579720626276400340540687013665099477551458348129102088618361745158673111757871083783880384786818716675179609957267487624993539275409316283860268944400754318665280566429956092526555947286266806591767802818223484766666271142927737412289284611614382748008696676464334157695348471

print(c)
# 51298575439582965784709335152059190835305126166438646589369499569428503835480418841408132266294091481013029021796067865137829386370176771358549523435135941877535688535317287350930103706346511719290416785053872504275498831270025102211793188751664805369414883387849038010293938521738911310864582949611581363258

print(pow(p+q, 2019, n))
# 116622952696503724444465816906812927416603315297598995734109952470693593204299624097288573735780464942963720997719694033378973971604112334413336782598075611956878592757766346915810900585142701963781432186914454664547551508332077962977944352243565906344660561255453917679867097810681750809061744116605905787747

print(pow(p+2019, q, n))
# 46935581819524717607675319301313485106684889957138298327245990937934310422542055504175491111118389178173005337213903985686712577881019021348501335888175248295397612880683801733649468701485843002169345784241756189697901370624950199354359977266595488202827970067500373575114835718127956891051157026649793602861

题目已经给出了n、c、e的值,按照常规解法,先利用工具分解n,在求解d,最后解出m,转化成字符串就能解,当然这题的n的确可以分解,题目也很简单,具体解题脚本:

import gmpy2
import libnum

n = 132991872691788324082134861997953579720626276400340540687013665099477551458348129102088618361745158673111757871083783880384786818716675179609957267487624993539275409316283860268944400754318665280566429956092526555947286266806591767802818223484766666271142927737412289284611614382748008696676464334157695348471
p = 10100000370508524350215423105629341272568481505717762357232181858867122861251794817081318870772438423452778514690530003171529258285308766771907289581201441
q = 13167511664664654241879722275239314077796628288014993501946163865534098363688179601787128893069641975126584216420427952135663458656314745346906315477111831
c = 51298575439582965784709335152059190835305126166438646589369499569428503835480418841408132266294091481013029021796067865137829386370176771358549523435135941877535688535317287350930103706346511719290416785053872504275498831270025102211793188751664805369414883387849038010293938521738911310864582949611581363258
e = 65537
phin = (p-1)*(q-1)
d = gmpy2.invert(e,phin)
m = pow(c,d,n)
print(libnum.n2s(int(m)))
# b'AceBear{1_Hop3_1t_w4s_n0t_t00_34sy_f0r_U}'

      但既然要深入学习RSA解题方法,不能单单止步于会套简单的脚本就行,后面如果遇到n不能分解,或者题目稍微变形一下又不会了,所以为了加深下理解,也应对其他变形,下面就将数论的过程简单分析一下,仅供自学:

      先将给出的两个已知值pow(p+q, 2019, n)设为apow(p+2019, q, n)设为b:

 

CTF-RSA 数论解题记一:2019-AceBear-babyRSA

推导后的脚本全是已知数:

# 求q就变成了 q = gcd(a-(b-2019)**2019,n)
import gmpy2
import libnum

n = 132991872691788324082134861997953579720626276400340540687013665099477551458348129102088618361745158673111757871083783880384786818716675179609957267487624993539275409316283860268944400754318665280566429956092526555947286266806591767802818223484766666271142927737412289284611614382748008696676464334157695348471
c = 51298575439582965784709335152059190835305126166438646589369499569428503835480418841408132266294091481013029021796067865137829386370176771358549523435135941877535688535317287350930103706346511719290416785053872504275498831270025102211793188751664805369414883387849038010293938521738911310864582949611581363258
a = 116622952696503724444465816906812927416603315297598995734109952470693593204299624097288573735780464942963720997719694033378973971604112334413336782598075611956878592757766346915810900585142701963781432186914454664547551508332077962977944352243565906344660561255453917679867097810681750809061744116605905787747
b = 
46935581819524717607675319301313485106684889957138298327245990937934310422542055504175491111118389178173005337213903985686712577881019021348501335888175248295397612880683801733649468701485843002169345784241756189697901370624950199354359977266595488202827970067500373575114835718127956891051157026649793602861
e = 65537

q = gcd(a-(b-2019)**2019,n)
p = n//q
phin = (p-1)*(q-1)
d = gmpy2.invert(e,phin)
m = pow(c,d,n)
print(libnum.n2s(int(m)))
# b'AceBear{1_Hop3_1t_w4s_n0t_t00_34sy_f0r_U}'

上一篇:题解 [51nod1753] 相似子串


下一篇:2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - F. 旋转