[BJDCTF2020]rsa_output 1:
题目描述:
{21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111,2767}
{21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111,3659}
message1=20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599
message2=11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227
题目分析:
- 首先先描述一下题目:题目一共有四行数据,前两行数据中每行数据包含两个元素,两行数据中第一个元素都相同,第二个元素不同
- 由元素相同可以想到共模攻击
- 由此可以得出:
c1=20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599
c2=11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227
e1=2767
e2=3659
n=21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111
- 各字母都分析出来了,那么直接上解题脚本即可:
c1=20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599
c2=11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227
e1=2767
e2=3659
n=21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111
_,s1,s2 = gmpy2.gcdext(e1,e2) # 扩展欧几里得算法的内置函数
m1 = (pow(c1,s1,n))*(pow(c2,s2,n))%n
x = gmpy2.gcd(e1,e2)
k = 0
while k < 1000:
m11 = m1 + k*n
m,s = gmpy2.iroot(m11,x)
if s:
print(libnum.n2s(int(m)))
break
k += 1
gmpy2.gcdext(a,b) : 【扩展欧几里得算法的内置函数】
Return a 3-element tuple (g,s,t) such that
g == gcd(a,b) and g == as + bt
【返回一个 3 元素元组 (g,s,t),使得 g == gcd(a,b) 和 g == as + bt】
- 最后得到flag{r3a_C0mmoN_moD@_4ttack}
收获与体会:
- 天知道这题我看了多久,我一直没看到题目给的 e,我说怎么大家就用 n,c1,c2 就能求出来了,还一度怀疑题目出错了,原来小丑竟是我自己。所以说信息一定要看全,一定要划到最后面
SameMod 1
题目描述:
{6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249,773}
{6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249,839}
message1=3453520592723443935451151545245025864232388871721682326408915024349804062041976702364728660682912396903968193981131553111537349
message2=5672818026816293344070119332536629619457163570036305296869053532293105379690793386019065754465292867769521736414170803238309535
题目分析:
- 和上一题好像啊!那话不多说直接套用以上解题脚本
- 运行后还是发现有一些不一样的,因为直接套用得不到flag,哪里出问题了?
- 打印libnum.n2s(int(m))和m的结果:
libnum.n2s(int(m)) = b'\x86\x8e~\xd9\x1f\x06\xe6\x9f\xd2\x9b\xd3\xa2j\xa8\xaf4"\xc9\x90\xe2\x81TI>J\xf2\x89\xa9^>\x93\xd4P\xba\x05'
m = 1021089710312311910410111011910111610410511010710511610511511211111511510598108101125
- 大佬们的见解:
- 显然第一位所说 “ m的开头为1,而这样是不可能转换为可见字节 ”,这一说法有点问题。上面一题m开头就为1,得到了flag,m开头为1,所以一串数字开头为1是可以转字节的,所以大家别被误导了
- 既然不能转字节,那么就试试转ascii码吧,转化代码如下:
m = str(m)
flag = ''
i = 0
while i < len(m):
if m[i] == '1':
flag += chr(int(m[i:i+3]))
i += 3
else:
flag += chr(int(m[i:i+2]))
i += 2
print(flag)
- 最终得到flag{whenwethinkitispossible}
收获与体会:
- 至今为止数字串转flag有2种方法(一种不行就试另一种):
1.转字节
2.转ascii码 - 这里简单说一下上面提到的16进制转字符串,十六进制数的一个基本特点:它由十六个数码:数字0~9加上字母A-F组成,所以说纯数字转字符串一般不考虑16进制转化(因为它一般不是纯数字)