彩笔
2022-11-17

2022四川省赛Cryp...

Crypto

写博客时的本机python环境:python 3.10 x64

cry1-babyRSA

题目附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python3
import libnum
import gmpy2


def main():
m = ""
p = libnum.generate_prime(1024)
q = libnum.generate_prime(1024)
n = p * q
e1 = 65537
e2 = 1145141
m = libnum.s2n(m)
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
print(f"n = {n}")
print(f"e1 = {e1}")
print(f"e2 = {e2}")
print(f"c1 = {c1}")
print(f"c2 = {c2}")

if __name__ == "__main__":
main()

# ------------ output -------------
# n = 11609263367794994463117283145812710043177521810736993971752031031462916890183901184704668542746877577916588155978013244385351397164066533771160861236441526284927774454246028029331726391203226023580325080150500633513024867014342350030181272221968801196510315424256352865890631054232306002238256568004250127485008008138279976475038656972273740968642332785779132654095393753232949667278798806004585797554024955342308244602767094536835410577382144435188162865642061122467384470501907391577779349252938141732012071206498806107556481558249549513041515803734342211746038126753951345855276903954190730328577080831957273691313
# e1 = 65537
# e2 = 1145141
# c1 = 8279258823057357102846768374381269167364145680055017957250521243478403606503599610855366519746944230676766499525422449675601214010991204564154995560170186683394412090168422510245266135032687364205431432451045158622417794414045719898864520112347836962316252383017549810699146506152781517871135246521405624365475969605452621085531890669372145482824845129281827033881675216546685064514926792907604133415349309151330709913454541960741984877203112442510747386406221828180805888471328964423290560512976977772551838742784356814497777401061881079781523967957560383718977490546677541952293716448514035557723329598904161762173
# c2 = 4995747575438050007737011353038705757162003396847797286289786278729187499823790079035532946676851313055563930519198963823829616599717198622635901839657079748022082189146477789049024407969208203999231434278100203042702919909473619456123328867313626560538182915794195719942071958092695261033449894563006040003298826647287929451919428024895476725340892133852628235964798488419924387986089462246202364608313134686465936926347848518960121189416319175083481701958106210362456062685045840587374473767109533027613795056920007028898921123363733374705988009798831764416119904696307107441325551226052940068337901039381485797771

解题思路

查看代码和注释掉的运行结果可知:m(密文)未知,已知e1,e2,c1,c2,n

分析出是共模攻击->(RSA模数攻击 当使用公共的模数n,不同的私钥e1, e2对同一密文进行加密时,如果能截获密文c1, c2那么可能可以直接解密。)

解题代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
n = 11609263367794994463117283145812710043177521810736993971752031031462916890183901184704668542746877577916588155978013244385351397164066533771160861236441526284927774454246028029331726391203226023580325080150500633513024867014342350030181272221968801196510315424256352865890631054232306002238256568004250127485008008138279976475038656972273740968642332785779132654095393753232949667278798806004585797554024955342308244602767094536835410577382144435188162865642061122467384470501907391577779349252938141732012071206498806107556481558249549513041515803734342211746038126753951345855276903954190730328577080831957273691313
e1 = 65537
e2 = 1145141
c1 = 8279258823057357102846768374381269167364145680055017957250521243478403606503599610855366519746944230676766499525422449675601214010991204564154995560170186683394412090168422510245266135032687364205431432451045158622417794414045719898864520112347836962316252383017549810699146506152781517871135246521405624365475969605452621085531890669372145482824845129281827033881675216546685064514926792907604133415349309151330709913454541960741984877203112442510747386406221828180805888471328964423290560512976977772551838742784356814497777401061881079781523967957560383718977490546677541952293716448514035557723329598904161762173
c2 = 4995747575438050007737011353038705757162003396847797286289786278729187499823790079035532946676851313055563930519198963823829616599717198622635901839657079748022082189146477789049024407969208203999231434278100203042702919909473619456123328867313626560538182915794195719942071958092695261033449894563006040003298826647287929451919428024895476725340892133852628235964798488419924387986089462246202364608313134686465936926347848518960121189416319175083481701958106210362456062685045840587374473767109533027613795056920007028898921123363733374705988009798831764416119904696307107441325551226052940068337901039381485797771

from gmpy2 import *
import libnum

# n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
# e1=11187289
# e2=9647291
s = gcdext(e1, e2)
s1 = s[1]
s2 = -s[2]

# c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
# c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
# e2=9647291
c2 = invert(c2, n)
m = (pow(c1, s1, n) * pow(c2, s2, n)) % n
print(m)
# print(libnum.n2s(m))
print(libnum.n2s(int(m)))
AC

cry2-russia

题目附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python3
from Crypto.Cipher import AES
import base64
import libnum
import gmpy2

def enc1(text):
enc1_text = base64.b64encode(text.encode())
enc1_text = enc1_text.decode()
print(f"enc1: {enc1_text}")

def enc2(passwd, text):
aes = AES.new(passwd.encode(), AES.MODE_ECB)
enc2_text = aes.encrypt(text.encode())
enc2_text = base64.b64encode(enc2_text).decode()
print(f"enc2: {enc2_text}")

def enc3(m, n):
p = libnum.generate_prime(1024)
q = libnum.generate_prime(1024)
phi = (p - 1) * (q - 1)
e = 3
m = libnum.s2n(m)
d = gmpy2.invert(e, phi)
c = pow(m, e, n)
print(f"enc3: {c}")

def main():
enc1_text = ""
enc2_text = ""
flag = ""
enc1(enc1_text)
enc2(enc1_text, enc2_text)
enc3(flag, enc2_text)

if __name__ == "__main__":
main()

# ------------ output -------------
# enc1: ZGE2MWU2ZWZmZGU1ZWMyM2JhMjNlMTFkZDA5ZTJiOWQ=
# enc2: NyRexkM90E863Le1zKvYwsScudhxcTxU0yMmzFaTVedpDGe7TUXq1zO/1cmgJ/qf58qSDCGHcgfTYg2DWpXZfopPdB/BgvEQ3C22Y3S5unUsKYqj6OmzRnSn99jAeVrufVJt6/bzYQBF/go1agh8DO9CSdOfcVKxZ4CsK+N7Mq73ENyMjGyYA3SGgFtCliMs7NndpqHP1Df5CKTXLcZmhnmz4M3tz6sHOgsIL2YcwPqx2k6x790X2Gvx9XMMCvqJsM3NABqRtSVf95BCeSxv4DfBFpEOlpAn5wBcWuoZ4NO5fsY0MZkoC3zzwUaXfrs7uxYczpvlRRySwHvLJOtP26dDiNDmccVMS+mZ7UGAVKeH8ppPrDUN1IcEU/5tdCJiAmF4B0tNy1XYa/O/7aRb4KkVX44MCGmKkBrwPD1hYK8HGYMz30qFKKpIykI0w0owJoAKA9/RMAE6Z1V5kgx8v7vZDtLOCOiPptOsru11iihVX+Xgf57BRgifq+nKaX/VFhd9QQClWO86fDQ9ZKiR4uuVZ51AH1FrJeLS3apK9zNsFKzTdJ80KuAGyF6HcrJYyRLqi8ztvPvj2XK4aIg5vhSaT4BWelObxCjI1AQdVbZrJB4lM5R+1br9YB2/ejPTTANIWQB3BDjd8rmppCucLmyrMgLFS37VWSXm8a1f4lS9wmDpxqBsemd38hH5MAg91fEado3gNMEAlPrX8iv6d+wbgsgnNwkft9bxRaHq33/kNIG36zZ4RMh/CXPW4HLlC15PTLgp9CGSDFrydW9wv6Ev/7f/Ah2J6LW3eQdQDf0JaRM0jz1UGO/92oZvlaxOmXV75cpsZGdBZWM7HgMhhw==
# enc3: 2217344750798720137211120200903285462230563024555651912713385064753001965092033686112882615149786798919875318682573208992245531622396450681252127429077764504250880492726521610205619327615972895299175499177769621852123579481687532329488459790907146543801125126149224525924453

解题思路

解出B64 Menc1 = da61e6effde5ec23ba23e11dd09e2b9d

解出AES ..看出是ECB方式(代码里有提示) 不需要参数VI 解出 Menc2即为n

RSA小e攻击

存的脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#python3
## -*- coding: utf-8 -*-#
from gmpy2 import iroot
import libnum
e = 0x3
n = 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793
c = 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365

k = 0
while 1:
res = iroot(c+k*n,e) #c+k*n 开3次方根 能开3次方即可
#print(res)
#res = (mpz(13040004482819713819817340524563023159919305047824600478799740488797710355579494486728991357), True)
if(res[1] == True):
print(libnum.n2s(int(res[0]))) #转为字符串
break
k=k+1
#b'flag{25df8caf006ee5db94d48144c33b2c3b}
# 套上本题数据
# flag{9c049aaf965667626961f2ab6024fd7a}
AC

暂存一道练手re无关Cry

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>
unsigned char aFKWOXZUPFVMDGH[] =
{
102, 10, 107, 12, 119, 38, 79, 46, 64, 17,
120, 13, 90, 59, 85, 17, 112, 25, 70, 31,
118, 34, 77, 35, 68, 14, 103, 6, 104, 15,
71, 50, 79, 0
};

int main() {
std::string s = "f";
for (int i = 1 ;i < 33;i ++) {
std::cout << (char)(aFKWOXZUPFVMDGH[i] ^ aFKWOXZUPFVMDGH[i - 1]);
}
return 0;
}