随便做做crypto---wp

crypto3

题目
import libnum
import sympy
from Crypto.Util.number import *

hb = 'flag{******}'
key = 'lalala'
strr = int(len(hb) / 2)
hb1 = hb[:strr]
hb2 = hb[strr:]
numhb = getPrime(1024) * libnum.s2n(key)
p = sympy.nextprime(numhb)
q = sympy.nextprime(p)
N = p * q
e = 0x10001
X1 = libnum.s2n(hb1)
X2 = libnum.s2n(hb2)
Y1 = X1 + X2
Y2 = pow(X1, 3) + pow(X2, 3)
m1 = pow(Y1, e, N)
m2 = pow(Y2, e, N)
print(str(N))
print(str(m1))
print(str(m2))

# N=169571714276836750768696835008286797130964560422135983632253460993844035070277271992940820745023753945894502976570008200589227013451254780779721268856064051799757956338533517600254186053716792892722735738924990872043856059071005689245420166459070018206523542210950116342161822850237993101505160818628595991502441957067340348806649724662522892332480243279436888202057735982434756342193071150485301462887812976898235230327266061793213127098569370855345779167670721322068425019594539396035695141165203949438822818707800302694750619436848158501146001272249288440359876315789666553512511334802790123284335714644770001763786101749041692403224266378333
# m1=137172276639648887866557875830283309268893058083402908605493428856931096246187056556856467774180211381223871133607767655336431349621874557506065545371474065840072026317886134443311087628235313414310040904327417341374591890476935829706967293090047575836949411891533957262211584538513973095674259149874069839572980565963185135218532015632775320049705004780825401043351437275761168698343756180608793172308795450259671671126163498209248726075329062986372656262335822210535681935882187351049078989043430971982943253054626620489690242020364833122097528269983272067077892250086096922160648275675860338120822069436693644821559962215200528625442048903486
# m2=85600331898169838702390350356428627676930745956406210582645430675260910062349006731528704102512561673331068948748510606713038245214294987447829875453022328315398197906113790659337256909918983375112298910555431769732760886290698793196809041462016219417622456176539301079538878853012896990413165489142039700369298843291500575220073632525301870447773813204843605644953473011827605983785439793140776467915226524477686019127682934182174874779811395295673168383049917465131906568138545253206085372839780162957083500051701697689589520178100058660524276265753437347330401197091143962953867565321953109860311053126708424330474158880008982673477031520209


过程分析

根据p q相近,直接开方往前推得到p,进而得到q。接下来简单RSA解密解出Y1Y2,然后构造方程组flag1+flag2-Y1flag1**3+flag2**3-Y2,最好解方程得到flag1flag2

解题代码
from Crypto.Util.number import *
import gmpy2
from sympy import *

n = 169571714276836750768696835008286797130964560422135983632253460993844035070277271992940820745023753945894502976570008200589227013451254780779721268856064051799757956338533517600254186053716792892722735738924990872043856059071005689245420166459070018206523542210950116342161822850237993101505160818628595991502441957067340348806649724662522892332480243279436888202057735982434756342193071150485301462887812976898235230327266061793213127098569370855345779167670721322068425019594539396035695141165203949438822818707800302694750619436848158501146001272249288440359876315789666553512511334802790123284335714644770001763786101749041692403224266378333
m1 = 137172276639648887866557875830283309268893058083402908605493428856931096246187056556856467774180211381223871133607767655336431349621874557506065545371474065840072026317886134443311087628235313414310040904327417341374591890476935829706967293090047575836949411891533957262211584538513973095674259149874069839572980565963185135218532015632775320049705004780825401043351437275761168698343756180608793172308795450259671671126163498209248726075329062986372656262335822210535681935882187351049078989043430971982943253054626620489690242020364833122097528269983272067077892250086096922160648275675860338120822069436693644821559962215200528625442048903486
m2 = 85600331898169838702390350356428627676930745956406210582645430675260910062349006731528704102512561673331068948748510606713038245214294987447829875453022328315398197906113790659337256909918983375112298910555431769732760886290698793196809041462016219417622456176539301079538878853012896990413165489142039700369298843291500575220073632525301870447773813204843605644953473011827605983785439793140776467915226524477686019127682934182174874779811395295673168383049917465131906568138545253206085372839780162957083500051701697689589520178100058660524276265753437347330401197091143962953867565321953109860311053126708424330474158880008982673477031520209
e = 65537
p_near= gmpy2.iroot(n,2)[0]
while n%p_near !=0:
    p_near = gmpy2.next_prime(p_near)
p = p_near
q = n//p
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
Y1 = pow(m1,d,n)
Y2 = pow(m2,d,n)
f1,f2 = symbols("f1 f2")
eq = [f1+f2-Y1,f1**3+f2**3-Y2]
result = nonlinsolve(eq,[f1,f2])
result = list(result)
flag2 = long_to_bytes(result[0][0])
flag1 = long_to_bytes(result[0][1])
print(flag1+flag2)

crypto4

题目
from Crypto.Util.number import bytes_to_long, getPrime
import random
import gmpy2

keylist = []
flag = bytes_to_long(b'flag{**}')
p = getPrime(1024)
q = getPrime(1024)
n = p * q
e1 = gmpy2.next_prime(bytes_to_long(b'**'))
e2 = gmpy2.next_prime(bytes_to_long(b'6666'))
c1 = gmpy2.powmod(flag,e1,n)
c2 = gmpy2.powmod(flag,e2,n)
print(n)
print(c1)
print(c2)

e1 = '%d'%e1
for r in range(0,len(e1)):
    keylist.append(random.randint(100,199))
print(keylist)

e1list = []
for j in range(0,len(e1)):
    random.seed(keylist[j])
    randintlist = []
    for R in range(0,4):
        randintlist.append(random.randint(100,199))
    e1list.append((~ord(e1[j])&randintlist[j%4]) | (ord(e1[j])&~randintlist[j%4]))
    del randintlist[j%4]
    print(randintlist)
print(e1list)

'''
n=21807675134387098933635237678146845036583696984357663683488748080829483853198203668735865657616812612052775661988329435840191288593418358543719711827693816578135358770579775968028266034644360313911757477475616524605922350524652035865299134957110900485592323929981668761308641828581643126191299630907815171647102232958694262938834918331556522196044513846105108143358418616911223331435217343581827675315976809659990746623067596383893046883261355361042819325420657196707711768986106294297724626784882457271410755396279972388351302933540533213574517333203975807264866046449074818800161542276378655835742555837283693154957
c1=14709876852760517760043591522679290651819063885619597306580044017686180496506515208013013917112406205255537367066291914458424445820326513648091870599699057050684884463490551592423395095314671463268173945773528273916332670117949670413574371532748892091772303720364748888220989530739964855443071728402886395084283982490365070661176654896828641964322897096783714493685298674447824983592332523937711595154802835116401644147229643025171439570244527872994971648546910411481782599587688095018751048490460142746826968362967573362607757309149275620071933506446214751582237839379641586807974694517359438571748784470346605048635
c2=3346062887708823601282118516968172583544253358532240016306332272158534009671048815513654617141961793154843469414279724002538623087358888923806094834169932559359730780230942016302746184004200582940696577658307434465253573027049717213332310148261126872565958735825843068610180935951961418836436926178722386161432074389311244766156369057060145813059234960313970610886360930148822971649284506341974843593454617632924152665364277184286497098690541100307845588580063106472620307968202339949679226279056536130377155283890739994841444374640411283713534892970878112387182923839882534806616486601182296902218007000219787990172
[109, 145, 179, 116, 137, 105, 170, 123, 128, 116, 133, 136]
[129, 158, 157]
[196, 166, 100]
[125, 115, 107]
[195, 176, 169]
[123, 152, 141]
[175, 174, 113]
[144, 175, 140]
[106, 134, 111]
[151, 165, 146]
[195, 169, 192]
[163, 145, 141]
[173, 154, 167]
[179, 163, 89, 247, 88, 163, 186, 243, 176, 128, 150, 88]


过程分析

题目给了c1,c2,e2,n,所以只需要解出e1,再利用共模攻击即可得到flag
根据给出的keylist列表循环生成randintlist列表,再把randintlist列表[j%4]的值跟e1list[j]的值套题目的与运算 解出e1

解题代码
from Crypto.Util.number import *
import gmpy2
import random

keylist = [109, 145, 179, 116, 137, 105, 170, 123, 128, 116, 133, 136]
ellist = [179, 163, 89, 247, 88, 163, 186, 243, 176, 128, 150, 88]
e1 = ''
for j in range(len(keylist)):
    random.seed(keylist[j])
    randintlist = []
    for R in range(0,4):
        randintlist.append(random.randint(100,199))
    e1 += chr((~ellist[j]&randintlist[j%4]) | (ellist[j]&~randintlist[j%4]))
e1 = int(e1)
e2 = gmpy2.next_prime(bytes_to_long(b'6666'))
n = 21807675134387098933635237678146845036583696984357663683488748080829483853198203668735865657616812612052775661988329435840191288593418358543719711827693816578135358770579775968028266034644360313911757477475616524605922350524652035865299134957110900485592323929981668761308641828581643126191299630907815171647102232958694262938834918331556522196044513846105108143358418616911223331435217343581827675315976809659990746623067596383893046883261355361042819325420657196707711768986106294297724626784882457271410755396279972388351302933540533213574517333203975807264866046449074818800161542276378655835742555837283693154957
c1 = 14709876852760517760043591522679290651819063885619597306580044017686180496506515208013013917112406205255537367066291914458424445820326513648091870599699057050684884463490551592423395095314671463268173945773528273916332670117949670413574371532748892091772303720364748888220989530739964855443071728402886395084283982490365070661176654896828641964322897096783714493685298674447824983592332523937711595154802835116401644147229643025171439570244527872994971648546910411481782599587688095018751048490460142746826968362967573362607757309149275620071933506446214751582237839379641586807974694517359438571748784470346605048635
c2 = 3346062887708823601282118516968172583544253358532240016306332272158534009671048815513654617141961793154843469414279724002538623087358888923806094834169932559359730780230942016302746184004200582940696577658307434465253573027049717213332310148261126872565958735825843068610180935951961418836436926178722386161432074389311244766156369057060145813059234960313970610886360930148822971649284506341974843593454617632924152665364277184286497098690541100307845588580063106472620307968202339949679226279056536130377155283890739994841444374640411283713534892970878112387182923839882534806616486601182296902218007000219787990172
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 the_same_mod(c1,c2,e1,e2,n):
    s = egcd(e1,e2)
    s1 = s[1]
    s2 = s[2]
    # 求模反元素
    if s1 < 0:
        s1 = - s1
        c1 = gmpy2.invert(c1, n)
    elif s2 < 0:
        s2 = - s2
        c2 = gmpy2.invert(c2, n)

    m = pow(c1, s1, n) * pow(c2, s2, n) % n
    print(long_to_bytes(m))
the_same_mod(c1,c2,e1,e2,n)

【被一个人太喜欢了,被喜欢的那个人,好像就不太懂得怎么喜欢对方了。】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值