前言:
这个算是我打的第一个正式的CTF了,也是第一次打的这么认真,一放题就是做,睡醒就是做,天天都是密码题,天天破防,结局是好的,校第二,队伍总分一万出头,我拿了三千多分,被带飞了,哈哈,唯一的遗憾就是没有把纯密码部分ak,week2,week3,week4都还差一道,其他的混做题等以后学了其他方向再去做!
——2024.12.1
凯撒加密:
签到送分题
YEI{CKRIUSK_ZU_2024_MKKQ_INGRRKTMK}
一眼凯撒,简简单单的送分题
找到SYC即可;
RSA:
看题发现,就是普普通通的入门RSA,很简单(原理请看RSA原理那篇文章)
直接出就好了:
已知n = p * q, p, q, c, e
from Crypto.Util.number import long_to_bytes, getPrime
import gmpy2
p = getPrime(128)
q = getPrime(128)
n = p*q
e = 65537
n = 33108009203593648507706487693709965711774665216872550007309537128959455938833
p = 192173332221883349384646293941837353967
q = 172282016556631997385463935089230918399
c = 5366332878961364744687912786162467698377615956518615197391990327680664213847
phi = (p-1)*(q-1)
d = pow(e,-1, phi)
m = pow(c, d, n)
m = 110789406762543471388626033919925647741
print(long_to_bytes(m))
#SYC{RSA_is_easy}
dp:
看题也就知道是普普通通的dp泄露,那就直接打!
这里注释一下dp= d mod (p - 1)
根据rsa的原理,很容易知道
import binascii
from gmpy2 import*
from Crypto.Util.number import *
c = 127916287434936224964530288403657504450134210781148845328357237956681373722556447001247137686758965891751380034827824922625307521221598031789165449134994998397717982461775225812413476283147124013667777578827293691666320739053915493782515447112364470583788127477537555786778672970196314874316507098162498135060
n = 157667866005866043809675592336288962106125998780791920007920833145068421861029354497045918471672956655205541928071253023208751202980457919399456984628429198438149779785543371372206661553180051432786094530268099696823142821724314197245158942206348670703497441629288741715352106143317909146546420870645633338871
e = 65537
dp = 2509050304161548479367108202753097217949816106531036020623500808413533337006939302155166063392071003278307018323129989037561756887882853296553118973548769
#这里直接爆破就好,还是很容易爆破出来的,
r = e*dp-1
for i in range(1,e):
if r%i == 0:
if n%((r//i)+1) == 0:
p = r//i + 1
#爆破出来了p,那么离flag也很接近了吧
q = n//p
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))
这里简单的解释一下dp泄露爆破的原理:
(1)edp = ed mod (p-1),有(3)edp-ed = k1(p-1)
又
(2)ed = 1 mod (p-1)*(q-1),有(4)ed-1=k2(p-1)(q-1)
根据(1)(2)可以得出,edp - 1 = 0 mod (p-1),可以知道edp-1 是p-1的倍数
根据(3)(4)换掉ed可知:
edp=【k2(q-1)+k1】(p-1)+1
然后直接爆破p就好
XOR:
又是看了题就知道是异或,但是并没有那么简单,直接看题吧
这里要知道,python中 ’^‘是异或而不是次方
据题,可知,f1,f2,e2,又因为e2 = e1 ^ f2,那么根据异或小知识,可以知道e1 = e2 ^ f2, enc = e1 ^ f1,
flag = xor(long_to_bytes(enc), key)
但是key不知道,这里根据len(key) == 4,并且flag的题头是‘SYC{’
这里我是直接把enc给long_to_bytes, 根据前四个对应的字符来异或’SYC{‘
从来可以得到key,然后就可以得到flag了
from Crypto.Util.number import long_to_bytes
from pwn import xor
e2 = 10706859949950921239354880312196039515724907
f1 = 4585958212176920650644941909171976689111990
f2 = 3062959364761961602614252587049328627114908
key = b'><0R'
e1 = e2 ^ f2
enc = e1 ^ f1
flag = xor(long_to_bytes(enc), key)
print(flag)
print(len(long_to_bytes(enc)))
print(long_to_bytes(enc))
#下面的步骤是得到key的过程:
print(chr(ord('m')^ord('S')))
print(chr(ord('e')^ord('Y')))
print(chr(ord('s')^ord('C')))
print(chr(ord(')')^ord('{')))
#SYC{a_part_0f_X0R}
优化:
from Crypto.Util.number import *
from pwn import xor
f1 = 4585958212176920650644941909171976689111990
f2 = 3062959364761961602614252587049328627114908
e2 = 10706859949950921239354880312196039515724907
enc = e2^f1^f2
key = xor(long_to_bytes(enc),b'SYC{')[:4]
flag = xor(long_to_bytes(enc),key)
print(flag)
#SYC{a_part_0f_X0R}
共模攻击:
由题目可知,本题是共模攻击,c = pow (m ,
e1 ,e2, c1,c2, n,都已经知道
c1 = pow (m,e1,n), c2 = pow (m,e2,n)
需要求得m,那么这里我根据结论反证一下吧
因为模数相同,将c1,c2带入
可得:((
有:
因为m < n, 所以,上式子等于m
得证,直接写python脚本即可
import gmpy2
from Crypto.Util.number import long_to_bytes
n = 19742875423645690846073637620470497648804310111201409901059297083827103813674034450200432098143959078292346910591785265323563248781526393718834491458926162514713269984791730816121181307827624489725923763353393879316510062227511469438742429290073999388690825732236465647396755899136346150862848924231619666069528077790933176798057396704758072769660663756346237040909579775389576227450505746914753205890194457812893098491264392293949768193694560954874603451253079446652049592976605414438411872223250039782381259212718733455588477129910357095186014496957765297934289263536712574572533650393220492870445376144568199077767
e1 = 911
e2 = 967
c1 = 18676091924461946809127036439355116782539894105245796626898495935702348484076501694838877829307466429933623102626122909782775514926293363853121828819237500456062111805212209491398720528499589486241208820804465599279152640624618194425740368495072591471531868392274503936869225072123214869399971636428177516761675388589238329574042518038702529606188240859751459632643230538522947412931990009143731829484941397093509641320264169403755707495153433568106934850283614529793695266717330769019091782929139589939928210818515744604847453929432990185347112319971445630830477574679898503825626294542336195240055995445217249602983
c2 = 4229417863231092939788858229435938841085459330992709019823280977891432565586698228613770964563920779991584732527715378842621171338649745186081520176123907689669636473919678398014317024138622949923292787095400632018991311254591786179660603414693984024161009444842277220189315861986306573182865656366278782315864366857374874763243428496061153290565891942968876789905670073321426112497113145141539289020571684634406829272902118484670099097148727072718299512735637087933649345419433312872607209633402427461708181971718804026293074540519907755129917132236240606834816534369171888633588190859475764799895410284484045429152
_,r,s = gmpy2.gcdext(e1,e2)
m = pow(c1, r, n) * pow(c2, s, n) % n
print(long_to_bytes(m))
#SYC{U_can_really_attack}
这里用到了扩展欧几里得算法,简单解释一下扩展欧几里得的原理:
前置知识:
裴蜀定理:ax + by = m , 其有解的充要条件为 gcd(a,b) | m
即充要条件是 m 必须能够被 gcd(a,b) 整除
欧几里得:
def gcd(a, b):
return a if b == 0 else gcd(b, a%b)
回归正传:
已经知道ax1 + by1 = gcd(a,b)和bx2+(a%b)y2 = gcd(b,a%b)
且gcd(a,b) == gcd(b,a%b)
ax1 + by1 = bx2 + (a%b)y2
a%b = a - (a/b )* b (说一下,比如 3 % 2 = 1, 3 - (3 / 2 )* 2 = 1这里一个是3整除2结果为1)
x1 = y2 ,
当b = 0 , ax = gcd(a,0),即ax = a, 所以x = 1, y = 0,然后我们回推递归求解即可!
- 特解:
ax + by = c (c% gcd(a,b) == 0)
此时一定有解,而且有多个,所以可求通解!我们先从特解开始:
ax + by = c 相当于 ax + by = gcd(a,b) 两侧同时乘了一个 c/gcd(a,b)
所以此条件下的特解x0 = x1 * c/gcd(a,b), y0 = y1 * c/gcd(a,b); - 通解:
所以:ax = ax + lcm(a,b) by = by - lcm(a,b)
而: lcm(a,b) = ab/gcd(a,b)
由此: ax = ax + ab/gcd(a,b)
约掉a得 : x = x + b/gcd(a,b) 即 通解 x = x0 + b/gcd(a,b) *k (k = 0 ,+-1,+-2......)
同理可得 : y = y - a/gcd(a,b) 即 通解y = y0 - a/gcd(a,b) * k (k = 0 ,+-1,+-2......)
不是套娃:
额,这道题真的有够我破防的,呜呜呜
-..-/../-./..--.-/.---/../..--.-/--../../..--.-/.--/.-/..--.-/-.--/../..--.-/--../../..--.-/--/---/..--.-/-.--/../..--.-/-../..-/.-/..--.-/--../..
直接摩西密码,秒了
得到:XIN_JI_ZI_WA_YI_ZI_MO_YI_DUA_ZI
一直不行,当时甚至中文,德文,日语什么的都来了一遍都不行,直到看到lower,才知道
xin_ji_zi_wa_yi_zi_mo_yi_dua_zi
进入发现Vigenere,提示:commander,然后我用了caesar把字符聚拢了一下,方便看到flag,呜呜呜,出题人真的是个二次元,太感动了
得到sunflower
解开发现居然还有一层啊!!!!!崩溃
看题:
a1fdbce928af7aae
一开始以为是十六进制,但是发现不是啊,太悲伤了,半夜三四点突然想到是md5啊
得到了:HaiKav
真的会破防,就在我以为要出了的时候,里面居然还有,我瞬间绷不住了,我真是又菜又爱玩啊
打开之后得到:NEFICPIC&CRTCTNEYO
emmm,开始以为是位置乱了,移位发现还是不行,但是我仔细一看发现,里面好像有crypto,巧,然后把所有的都提出来,发现NICECTF&NICECRYPTO,wowww~ ~刚刚好,
但其实是栅栏,栅栏密码key = 3,就可以得到NICECTF&NICECRYPTO了,
打开发现还有四层,当时附件还改了,我不知道,后面才看见,太悲伤了,一直出不来
废话不多说:
打开发现是表情包,想到base100,我寻思着有base13吗,然后去看tip,发现了端倪,上面Ba & Ro,ba是指base,ro是指rot,然后rot13,然后base64,最后直接base65536解出,
base100: � �👏👋🐾👚👪👇👱👞👚🐦👡👙👚👏👍🐯👏🐽👐👜🐦👇👱👜👙👤👡👙 🐬👥🐻🐯👏👋👈👚👪👇👘👰👛👮👡👙👎🐭🐯
rot13:8XTGcsPzgc/jbcXV8XFYe/Pzebmjb5nD8XTQcsPaydwjbW68
base64:8KGTpfCmtp/wopKI8KSLr/Cmrozwo5aQ8KGDpfCnlqjwoJ68
base65536 :𡓥𦶟𢒈𤋯𦮌𣖐𡃥𧖨𠞼 :原爞,启动! -> 原神,启动!
(出题的师傅人是真的好,还来提醒我附件换了,真的挺感动的,在奔溃的边缘得以缓解)
得到:SYC{H0W_P3RF3C+_YU0_AR3!}
imREM:
额,这道题拿到手不知道是什么,然后一直到week4的时候才知道是证书题,
这个public和key都是完整的,openssl,工具也可以一把梭,这个不详细解释了(解出来会得到n,e,c, c可以从key中提取),只解释一下private的做法:
这个private是不完整的,是证书的下半部分,那么我们需要把这部分的证书给手撕开来,得到一些私钥的线索
这个需要先用base64解码,但是不要用工具去解码,因为用工具输出的应该都是utf-8或者unicode具体我也不清楚,反正当时我也是用工具,但就是出不来,后来在python中用base64解码就出了,再转hex即可,
找到02开头81或80,然后就可以判断出dp,dq,inv(q , p)
然后应该就和dp泄露差不多了
from base64 import b64decode
import binascii
s = 2uqP/7tlAPCJrMVD8zoRsRviyUnqO6y7cV7G0Fo1AoGBALpb6vOC9Ya/BEYV8+yL
814K0KQc7LITkwqGrDWoDZAxmgWqVtoxHuhDWr5jF+ttFZBPx4fTezTEjarXXSt3
pB1c7EwnzO0Hy9qJH++g2dcCUCO8uGXBbAACZqCQZAAydSrM5zozWAYMBWcj54j0
LtyOEg4PWPXiTzJ//xxWaH+xAoGBAKFGRIyYD89JvlZA6oz7YnjzsnDlTq01td32
XAuw62dZQHWmg1npC3YtzFlgTyNY2QelObmryyc2vFnxVhTYcDXFLQwrX8X5YV4A
rFAAlyzxpNzYPzDHrdqLD6PhMU+wRuHVPyAtNBsL0N+mgQcsWJJvngSTHg86kJOl
HlNuLBGhAoGAFiG3VR+lubcPvXOVAvkt+c8rF6qcmXlb2Og0hNwDJ2roX98aqOVy
p5AWGPoA1siI4/RPIp1ClfEwKMjraun1ZJs/jKemaQk2hdhWkQ+6QinvUJbA1Lqm
TcRmKa1emY/U6I8ce6N69e7ver1DV4I/ugSahJlZT/JRyF5qj1uVZ/k=
print(b64decode(s).hex())
s = b64decode(s)
print(binascii.hexlify(s))
s = daea8fffbb6500f089acc543f33a11b11be2c949ea3bacbb715ec6d05a35
028181 00ba5beaf382f586bf044615f3ec8bf35e0ad0a41cecb213930a86ac35a80d90319a05aa56da311ee8435abe6317eb6d15904fc787d37b34c48daad75d2b77a41d5cec4c27cced07cbda891fefa0d9d7025023bcb865c16c000266a090640032752acce73a3358060c056723e788f42edc8e120e0f58f5e24f327fff1c56687fb1
028181 00a146448c980fcf49be5640ea8cfb6278f3b270e54ead35b5ddf65c0bb0eb67594075a68359e90b762dcc59604f2358d907a539b9abcb2736bc59f15614d87035c52d0c2b5fc5f9615e00ac5000972cf1a4dcd83f30c7adda8b0fa3e1314fb046e1d53f202d341b0bd0dfa681072c58926f9e04931e0f3a9093a51e536e2c11a1
028180 1621b7551fa5b9b70fbd739502f92df9cf2b17aa9c99795bd8e83484dc03276ae85fdf1aa8e572a7901618fa00d6c888e3f44f229d4295f13028c8eb6ae9f5649b3f8ca7a669093685d856910fba4229ef5096c0d4baa64dc46629ad5e998fd4e88f1c7ba37af5eeef7abd4357823fba049a8499594ff251c85e6a8f5b9567f9
exp:
from Crypto.Util.number import *
import gmpy2
n = 19909823107653171578063591352961144331355821517081529017694276790993397379180193511755806958091550033235815834847549265751244192211761569881061742997804509098095297146520946343734939782935970054031389390447526577982809412074573616889663964050032806967234869741452169276495048891650957729859124875343810181695665153129824527065062831773013713479602052423965588148263292672514853749647510938621421264137177666497737099263481269491867593812579958283619882699866915561357437484323854411934718569074869408000191465973545262527827064708529700071967884924505367105288433603597633451764659888020272057850625902629529400734213
e = 65537
c = 7919943289368038783724317497692126508862944891824633900678369076067377304246633550201479733917999309653837868431720402842331248180337133419210706758864980771784429471586885607950008535770975052759319391393162975172158181546945556996836823037899332592611500055778040689826681310669586932854911372024839505403827196536681522194462010678759612069086605347172317442348948842018650570415028244207642694056753005420698743763441702332704811711253108369634221705269362120683326305095756923569255799172080587394198712839298803950747051721445378968267999151065222977429033753473443764902682897042586783088412947719949355428108
p1 = 0xdaea8fffbb6500f089acc543f33a11b11be2c949ea3bacbb715ec6d05a35
dq = 0x00ba5beaf382f586bf044615f3ec8bf35e0ad0a41cecb213930a86ac35a80d90319a05aa56da311ee8435abe6317eb6d15904fc787d37b34c48daad75d2b77a41d5cec4c27cced07cbda891fefa0d9d7025023bcb865c16c000266a090640032752acce73a3358060c056723e788f42edc8e120e0f58f5e24f327fff1c56687fb1
dp = 0x00a146448c980fcf49be5640ea8cfb6278f3b270e54ead35b5ddf65c0bb0eb67594075a68359e90b762dcc59604f2358d907a539b9abcb2736bc59f15614d87035c52d0c2b5fc5f9615e00ac5000972cf1a4dcd83f30c7adda8b0fa3e1314fb046e1d53f202d341b0bd0dfa681072c58926f9e04931e0f3a9093a51e536e2c11a1
a = 0x1621b7551fa5b9b70fbd739502f92df9cf2b17aa9c99795bd8e83484dc03276ae85fdf1aa8e572a7901618fa00d6c888e3f44f229d4295f13028c8eb6ae9f5649b3f8ca7a669093685d856910fba4229ef5096c0d4baa64dc46629ad5e998fd4e88f1c7ba37af5eeef7abd4357823fba049a8499594ff251c85e6a8f5b9567f9
#转化成dp泄露,这个给了很多条件,我不知道有什么用,证书题其实也不常见
for i in range(1,65538):
p = ((dp*e-1)//i)+1
if n % p == 0:
print(p)
p2= 139366780536806265952989755984946005613683040843550738567578228396467356994133236355995164875843300802280010895144102144241447133593670597630811746145934665872367005294375732111408915384205212738302382734711912565019677628580803708931282556787630816046663643055532580256795845291765806134460998759909294103093
print(isPrime(p2))
print(isPrime(p))
q = n // p2
phi = (q-1)*(p2-1)
d = inverse(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))
#You_are_r1ght_bu7_Genshin_Impact_1s_@_brand_new_open_wor1d_@dventure_gam3_dev3loped_6y_miHoYo.
#输入压缩包,即可获得flag哦!
#SYC{OVvanSh3nO_Q1D0ng!}
额,这个好像写麻烦了,我看了官方的wp发现好简单,这里贴一下官方的wp
一个残缺的rsa私钥,一个加密后的key,一个exe结尾的压缩包 从key中提取c
from Crypto.Util.number import *
c = open('flag.enc', 'rb').read()
c = bytes_to_long(c)
print(c)
首先将拥有的两部分分别base64解密然后转16进制数观察
t = '''...''' t = t.strip()
import base64 from Crypto.Util.number import *
tb = base64.b64decode(t)
print(tb.hex())
前半部分: 308204a502010002820101009db757827029f6d0a0ac70c502ab948c28f31804dc8901c619fb9edd 3a87ab39c2cb2306ad6ccf39bc1a9b645b02c5a3c945c1daa523bf9a68ee5b68e41e48f32b38865a 9007c171964fb0a210a5b53b4c5d19ceed7685050deab3213ce767d7bff1469ea568a50584aa89ef a906c52a5cc67d05fe0200e1b0adc9af5ef8150fe28c565eb18977ddc74591ac0f483ee41a02366d 0a5efd5627f6e2e6887081263fc8288af96d5f253ce9edfde2aafa7ab3b1cb123da382e89ea829fd 30347620d35774c111a8ebd53054e460f7c3c9d20def8f8bb43dc5a4cf0d0844b84478a4a3ab734d 6437144792cebda0d8e0f6f628b700d96f55e1815e11fb2b83197205020301000102820101009a4f 9a857b2cf3da687a8fd392ab422a689e80afb0ff340719c1014cbf49a2945f2cd5d660b487849bb1 04bd09f70a5d183ef24ef528a6fd731153caaaf79eb49d632ec1490eed8c2f5f45192c64958fb145 9e4cc236262c
后半部分: 46e1d53f202d341b0bd0dfa681072c58926f9e04931e0f3a9093a51e536e2c11a10281801621b755 1fa5b9b70fbd739502f92df9cf2b17aa9c99795bd8e83484dc03276ae85fdf1aa8e572a7901618fa 00d6c888e3f44f229d4295f13028c8eb6ae9f5649b3f8ca7a669093685d856910fba4229ef5096c0 d4baa64dc46629ad5e998fd4e88f1c7ba37af5eeef7abd4357823fba049a8499594ff251c85e6a8f 5b9567f9
由ASN.1的标签原理可将两部分整理为:
308204a5020100 02820101:009db757827029f6d0a0ac70c502ab948c28f31804dc8901c619fb9edd3a87ab39c2cb230 6ad6ccf39bc1a9b645b02c5a3c945c1daa523bf9a68ee5b68e41e48f32b38865a9007c171964fb0a21 0a5b53b4c5d19ceed7685050deab3213ce767d7bff1469ea568a50584aa89efa906c52a5cc67d05fe0 200e1b0adc9af5ef8150fe28c565eb18977ddc74591ac0f483ee41a02366d0a5efd5627f6e2e688708 1263fc8288af96d5f253ce9edfde2aafa7ab3b1cb123da382e89ea829fd30347620d35774c111a8ebd 53054e460f7c3c9d20def8f8bb43dc5a4cf0d0844b84478a4a3ab734d6437144792cebda0d8e0f6f62 8b700d96f55e1815e11fb2b83197205 0203:010001 02820101:009a4f9a857b2cf3da687a8fd392ab422a689e80afb0ff340719c1014cbf49a2945f2cd5d6 60b487849bb104bd09f70a5d183ef24ef528a6fd731153caaaf79eb49d632ec1490eed8c2f5f45192c 64958fb1459e4cc236262c... ... ...46e1d53f202d341b0bd0dfa681072c58926f9e04931e0f3a9093a51e536e2c11a1 028180:1621b7551fa5b9b70fbd739502f92df9cf2b17aa9c99795bd8e83484dc03276ae85fdf1aa8e5 72a7901618fa00d6c888e3f44f229d4295f13028c8eb6ae9f5649b3f8ca7a669093685d856910fba42 29ef5096c0d4baa64dc46629ad5e998fd4e88f1c7ba37af5eeef7abd4357823fba049a8499594ff251c 85e6a8f5b9567f9
可知前半段完整的数据为n和c,后半段完整的数据为qInv
直接解密
from Crypto.Util.number import * import gmpy2
n = 0x9db757827029f6d0a0ac70c502ab948c28f31804dc8901c619fb9edd3a87ab39c2cb2306ad6ccf 39bc1a9b645b02c5a3c945c1daa523bf9a68ee5b68e41e48f32b38865a9007c171964fb0a210a5b5 3b4c5d19ceed7685050deab3213ce767d7bff1469ea568a50584aa89efa906c52a5cc67d05fe0200 e1b0adc9af5ef8150fe28c565eb18977ddc74591ac0f483ee41a02366d0a5efd5627f6e2e6887081 263fc8288af96d5f253ce9edfde2aafa7ab3b1cb123da382e89ea829fd30347620d35774c111a8eb d53054e460f7c3c9d20def8f8bb43dc5a4cf0d0844b84478a4a3ab734d6437144792cebda0d8e0f6 f628b700d96f55e1815e11fb2b83197205
e = 0x10001
q = 0x1621b7551fa5b9b70fbd739502f92df9cf2b17aa9c99795bd8e83484dc03276ae85fdf1aa8e572 a7901618fa00d6c888e3f44f229d4295f13028c8eb6ae9f5649b3f8ca7a669093685d856910fba42 29ef5096c0d4baa64dc46629ad5e998fd4e88f1c7ba37af5eeef7abd4357823fba049a8499594ff2 51c85e6a8f5b9567f9
p = n//q
d = gmpy2.invert(e,(p-1)*(q-1))
print(long_to_bytes(pow(c,d,n)))
nocCRT:
额,这个虽然是CRT,但是模数却不互质,所以会想到扩展CRT
扩展CRT的原理:
gcd(ni,nj) != 1, 单独讨论,设gcd(n1,n2) = g
x = c1 mod n1 , x = c2 mod n2
则,x = k1n1 + c1, x = k2 n2 + c2, 合并移项得到:
n1k1 - k2n2 = (c2 - c1),然后翡镯定理可知:
(n1/g) k1 = (c2 - c1) /g mod (n2 / g)
k1 = (c2 - c1) /g * (n1 / g)^{-1} mod (n2 / g)
k1 = (c2 - c1) /g * (n1 / g)^{-1} + k3 * n2 / g
带入可得:x = ( (c2 - c1) /g * (n1 / g)^{-1} + k3 * n2 / g) n1 + c1
然后就有: x = ( (c2 - c1) /g * (n1 / g)^{-1} + k3 * n2 / g) n1 + c1(mod n1n2/g)
from Crypto.Util.number import *
import gmpy2
n = 5 # 同余方程个数
a = [1259284928311091851012441581576, 1501691203352712190922548476321, 1660842626322200346728249202857, 657314037433265072289232145909, 2056630082529583499248887436721]
m = [1921232050179818686537976490035, 2050175089402111328155892746480, 1960810970476421389691930930824, 1797713136323968089432024221276, 2326915607951286191807212748022] # 模数
def exgcd(a, b):
if 0 == b:
return 1, 0, a
x, y, q = exgcd(b, a % b)
x, y = y, (x - a // b * y)
return x, y, q
def CRT():
if n == 1 :
if m[0] > a[0]:
return a[0];
else:
return -1;
for i in range(n):
if m[i] <= a[i] :
return -1;
x, y, d = exgcd(m[0], m[i])
if (a[i] - a[0]) % d != 0:
return -1;
t = m[i] // d;
x = (a[i] - a[0]) // d * x % t
a[0] = x * m[0] + a[0];
m[0] = m[0] * m[i] // d;
a[0] = (a[0] % m[0] + m[0]) % m[0]
return a[0];
ans = CRT()
print(ans)
from Crypto.Util.number import long_to_bytes
print(long_to_bytes(ans))
#SYC{wha+s_wr0n9!_CRT_bu+_n0+_<0mpr1me!}
nc:
nc连接,没什么,就是暴力破解,把四个未知字符爆破出来就好了,打开容器,然后
打开命令管理器,输入nc nc1.ctfplus.cn 19218,nc连接,
会出现这一行,然后把后面的字符串部分给输入下面根据题目编写的爆破脚本里面
会爆破出四个未知的字符
再把其输入
然后1回车,2回车 …………………………直到得到flag
SYC{MAYB3_Y0U_KN0W_A1AN-B3<K3R?}
import hashlib
import itertools
import string
# 目标哈希
target_hash = "74da6891e993963ec9c34c6f481159548566a68df7db60ca10e0176cdca86840"
# proof后面的字符串部分
proof_suffix = "8DYJCztWXcPPoNab" # 这是从服务器获得的 proof[4:]
# 字符集(包括大小写字母和数字)
charset = string.ascii_letters + string.digits
# 生成所有可能的 4 字符组合
for combination in itertools.product(charset, repeat=4):
candidate = ''.join(combination) # 组合成 4 字符的字符串
candidate_input = candidate + proof_suffix # 拼接 XXXX 和 proof[4:]
# 计算哈希
hash_result = hashlib.sha256(candidate_input.encode()).hexdigest()
# 检查是否与目标哈希匹配
if hash_result == target_hash:
print(f"Found matching XXXX: {candidate}")
break # 找到匹配的 XXXX 后退出
LLL:
根据题目的提示,
可以知道是三L的知识点,浅浅的了解一下格密码的知识点就好了,这题不需要了解那么的深,
格知识:
参数
模:
私钥:
公钥:
临时密钥
加密:
解密:
因为 b = (a*m + c) % p, 且 a, b ,p 都已经知道,所以直接构造格子,一开始无脑构造二维,
发现不行,观察一下数据,发现位数太大了,
超范围了,所以考虑构造三维格子
构造好直接在sagemath中跑即可
from Crypto.Util.number import *
from gmpy2 import *
a = 169790849804323540946197204708402762862586197604183102589270741859708550301920348112941305999764092197996929298474590062625556806793613268527763774013772685954699561684244945434843656515307801882995934869499880288594142919381501796488815033294127591623260894764750214588993456840404443515671353802614450411717
b = 87985708831523238980948938165414984318379459926002798504435964538203443877988599888615810231215118828138306895572062833107988965151522391460216837691927960249874511818878134399363147008042562222910234739940697553852540265617603482995091203105040187460485673579382171260197291783748886765929376179151804062085
p = 131724494512065658801039766546788821718063963144467818735768040631367069153816254855229655449559099188694403260044990366292026916085340250077198735215774149087025577263769846650728593180101073940507285459917860726551385227481715873503612683249433020201729190862430476054822102865441136763977415824331858801617
M = Matrix(ZZ,[[p,0,0],[-a,1,0],[b,0,2**400]])
c,m,k = M.LLL()[0]
flag = long_to_bytes(abs(m))
print(flag)
#SYC{1e989433efffd767589e989ad0f091075c06}
ecc:
还是看题目就知道知识点,椭圆曲线加密,去网上搜一下对应的知识点浅浅学一下就可以了
加密过程:
1、选一条椭圆曲线Ep(a,b),并取椭圆曲线上一点作为基点P(这里的a、b是方程中x一次项系数和常数项)
2、选定一个大数k作为私钥,并生成公钥Q=kP,
3、加密:选择随机数r,将消息M生成密文C,密文是一个点对,即C=(rP, M+rQ)。
4、解密:M+rQ-k(rP)=M+r(kP)-k(rp)=M
性质:
A(x1,y1),B(x2,y2)以及C(x3,y3)均在同一椭圆曲线y^2=x^3+ax+b上,且在有限域p上,其中C是AB直线与曲线的交点的关于x轴的对称点,即 A+B=C )有如下关系:
1、坐标的计算:
x3=k^2-x1-x2(modp)
y3=k(x1-x3)-y(modp)
2、斜率计算
若A=B,则k=(3x2+a)/2y1(A=B即要计算A点切线,需要求导)
若A≠B,则k=(y2-y1)/(x2-x1)
大致了解一下就可以看题了
K = k * G
c1 = m + rK
c2 = r * G
G为基点,k是私钥,K是公钥,我们已经知道c1,c2,具体解密过程如下脚本,最后用c1 - kc2就可以得到m了,直接在sagemath上跑
from Crypto.Util.number import *
p = 93202687891394085633786409619308940289806301885603002539703165565954917915237
a = 93822086754590882682502837744000915992590989006575416134628106376590825652793
b = 80546187587527518012258369984400999843218609481640396827119274116524742672463
k = 58946963503925758614502522844777257459612909354227999110879446485128547020161
cipher_left = 34210996654599605871773958201517275601830496965429751344560373676881990711573
cipher_right = 62166121351090454316858010748966403510891793374784456622783974987056684617905
E = EllipticCurve(GF(p),[a,b])#先E = EllipticCurve(GF(p),[a,b])建立一个椭圆曲线,要先建立后面才能用
c1 = E([40485287784577105052142632380297282223290388901294496494726004092953216846111 , 81688798450940847410572480357702533480504451191937977779652402489509511335169])
c2 = E( [51588540344302003527882762117190244240363885481651104291377049503085003152858 , 77333747801859674540077067783932976850711668089918703995609977466893496793359])
#这里要加上E说明是在E下上的点
m = c1 - k * c2
ml=cipher_left//m[0]
mr=cipher_right//m[1]
M=long_to_bytes(int(ml))+long_to_bytes(int(mr))
print(M)
#SYC{Ecc$is!sO@HaRd}
ezRSA:
这个是coppersmith的题,e 只有3 ,m = (m >> bits) << bits,可以知道是m的低位泄露,
了解一下sagemath:
PolynomialRing :构造多项式环
Zmod(n) :模运算
implementation='NTL' :执行 NTL
small_roots(self, X=None , beta=1.0 , epsilon=None):计算多项式的小整数根
其中的参数:X —— 根的绝对边界, beta(
(程序默认值是 1.0 ,此时 p=N),epsilon (默认:
monic():用于将多项式的首项系数归一化为1。它接受一个多项式作为参数,然后返回一个新的多项式,其中首项系数已经被归一化为1。这个过程可以简化多项式的表达式,使其更易于计算和分析
Dense univariate polynomials over (\ZZ/n\ZZ), implemented using NTL - Polynomials贴一个sagemath的用法
回归本题:
创建一个模n的多项式环,构造一个多项式f = 2024x - 2023 - h
然后在给定的范围内去寻找小根(范围需要直接去调参数,但是我还不怎么会调参数,这个参数一般都是0.4,但只是一般),然后再构建一个新的多项式,f = (mhigh + y)^3 - c,尝试恢复m,直接在sagemath上面跑就好,恢复出m然后long_to_bytes,即可领取一份flag!!
from Crypto.Util.number import *
import gmpy2
n = 98776098002891477120992675696155328927086322526307976337988006606436135336004472363084175941067711391936982491358233723506086793155908108571814951698009309071244571404116817767749308434991695075517682979438837852005396491907180020541510210086588426719828012276157990720969176680296088209573781988504138607511
c = 9379399412697943604731810117788765980709097637865795846842608472521416662350816995261599566999896411508374352899659705171307916591351157861393506101348972544843696221631571188094524310759046142743046919075577350821523746192424192386688583922197969461446371843309934880019670502610876840610213491163201385965
h = 111518648179416351438603824560360041496706848494616308866057817087295675324528913254309319829895222661760009533326673551072163865
e = 3
bits = 150
PR.<x> = PolynomialRing(Zmod(n))
f = 2024*x - 2023 - h
f = f.monic()
roots = f.small_roots(X = 2^500,beta = 0.4)
if roots:
mhigh = roots[0]
PR.<y> = PolynomialRing(Zmod(n))
f = (mhigh + y)^3 - c
f = f.monic()
roots = f.small_roots(X = 2^151,beta=0.4)
if roots:
m = mhigh + roots[0]
print(m)
m = 55098146333703730947926790790691720107068601034889480665048328600442527334253416918933209078294725467152711309939550589383549
print(long_to_bytes(m))
#SYC{crypto_is_very_interesting_why_dont_you_join_us}
easy_LLL:
额,这道题,看起来和week3的LLL好像,但是多了:
result = [encrypt(m) for i in range(5)]
c = [x[0] for x in result]
a = [x[1] for x in result]
虽然看起来直接上了难度,但是也可以直接构造三维格子,只选一组数据带入去出,过程和LLL的一模一样,非预期给出了,而且我试了每组数据,发现都可以出,格密码的话我是在NSS工坊上面瞎学的,做的很勉强。
from Crypto.Util.number import *
p = 114770017142688382362918268558878024848633097928402093647914503696492833723966801545716194546592346338592062332306371502256979159033965343002132956304625610134374822329402499359634555710129039614275145668904822690744696925414716152630310915301980153974374009140517084226870950134327432658087834138202887501571
c = 75827517416784647262997004080634347924631190865715212882627791181841845414253117114184423517850773219376565782814219713490136873921446382123059696483594598328510450811390866671002685611755205236016843942407419858592870716928648777362367108239158432436307113173823883182666320180058177554647020175991566479974
a = 154147211832384364492785997490497428696214843927503185938896425556028644075902949520267734189423717477702286854849502563505554965833703544305651488482204719931055591825164774932532116940955079750398001376723036214113076925445019856194390932639722726924707396244454184674407094860919513514591518499956074524561
M = Matrix(ZZ,[[p,0,0],[-a,1,0],[c,0,2**400]])
c,m,k = M.LLL()[0]
flag = long_to_bytes(abs(m))
print(flag)
#SYC{125b-5c7b19c7-90e2-8d87c8a8}
下面是非预期的方法:
(虽然我现在还是看不太懂)
-b = -c+a*m+kp
from Crypto.Util.number import *
p = 11477001714268838236291826855887802484863309792840209364791450369649283372396680 15457161945465923463385920623323063715022569791590339653430021329563046256101343 74822329402499359634555710129039614275145668904822690744696925414716152630310915 301980153974374009140517084226870950134327432658087834138202887501571
c = [2526915767412008250032358545184292856040462596793266290851792270487182851339723 38586150059681240174286398539605504685428942704518716124966316451750158262034932 65945456529848647562285359912541672751550625137876486033809099678631009005979648 033707322772087110235116987698692692467320479776960630479772236446980, 75827517416784647262997004080634347924631190865715212882627791181841845414253117 11418442351785077321937656578281421971349013687392144638212305969648359459832851 04508113908666710026856117552052360168439424074198585928707169286487773623671082 39158432436307113173823883182666320180058177554647020175991566479974, 40004397317197465344043603398406750064538475824927459799822216246602968059960442 39209286181541462187650487112017410839740281883027081539802479046385802021188067 65619059473461992793303215453474217538078389555984131852004514411356216424771791 5766667365412215754183668349398802684299015216478025166881475794536, 16711257143606850336586355581909703391105580636095435863487225535083010317005439 43537510580064102411213812181024220712744301103620954496763312398363601515308984 38152873706465650717840020981830214898820464926094417083615507867528577735652528 21037805549119284258373739189052221307754872723967188683410620808193, 10651222799904898854353754234563652892559410712812503063500266598057470900655884 04461890173576236818286779351250121446899637988659717829147046167982394519713705 11961281779438306334353650663495164449411037055054859128957955413918744183200858 441122917851347996800797164614883188302584586112732819164555910532500]
a = [1778761639208387205854746405113912490514188278533723873426352453414957924688261 99544624082182728094652999191797576747605771062756630817438777653951772485569478 51632490395611330919079562225834682464339000483539727288925669608735623951588145 9115499360779486974615331766141255410923960657795391638070660994726539, 15414721183238436449278599749049742869621484392750318593889642555602864407590294 95202677341894237174777022868548495025635055549658337035443056514884822047199310 55591825164774932532116940955079750398001376723036214113076925445019856194390932 639722726924707396244454184674407094860919513514591518499956074524561, 16223691031241644830331607928462613145244435229011047762013584288512500349306817 23307661742259970490940808366856178369114756385082839185763045025828488470974672 51286819613975600023439985149604495163647781268904127545271241114039490048103188 362740808427663167350820948490766499995036870926879430699822216419877, 15632433064946585686520565264291911655148061006083045632336151476178340661316282 65550663672158227471451092235303816897806250357950044589192623624203752255607904 67893332585836287433463308447660726674632677063603419250881619682710122472587150 879771212601074942044613408069114640355658551759306352327418458216623, 94727349364308455432706991721504607810501329870619614073375570944298709074650444 44213935631885480908192562500951610297851817034352572662714912365533225352941829 24407470734636151065015301339307500102900512267659061942103729043234608842386651 94406125116885468971886527174150462509520345910607640580833401931201]
Ge = Matrix(ZZ,[
[p,0,0,0,0,0,0],
[0,p,0,0,0,0,0],
[0,0,p,0,0,0,0],
[0,0,0,p,0,0,0],
[0,0,0,0,p,0,0],
[a[0],a[1],a[2],a[3],a[4],1,0],
[c[0],c[1],c[2],c[3],c[4],0,2^255]
])
for i in Ge.LLL():
if abs(i[-1]) == 2^255:
m = abs(i[-2])
flag = long_to_bytes(int(m))
print(flag)
#b'SYC{125b-5c7b19c7-90e2-8d87c8a8}
highlow:
这道题,真的绷不住了,开始看错题了,一直一直出不来,当时人都崩溃了,后面才发现len(flag) == 44,他的长度是352,太悲伤了,
这道题就是将flag的高位泄露,p异或752位,得到pxor,flag<<400,后400全都是0,异或不会变,所以pxor,相当于pxor的后四百位就是p,前272位也是没有变话的,这道题相当于已经知道了p的高低位,相当于高低位泄露,copper,直接打!
from gmpy2 import *
from Crypto.Util.number import *
pxor = 124229245244085791439650934438639686782423445183921252684721764061493908790073948877623812930339081158169421854801552819088679937157357924845248082716160727839419054107753000815066526032809275137495740454967765165248115412626716101315676902716808647904092798908601183908297141420793614426863816161203796966951
n = 14091206320622523674847720139761543154822190879035380245424481267482550932229611965964424965958386255076593911062804299275581742665134207390532802109700225140999812698020838683697375891035625255222001884477214361835101442288725383073334392995186053867261497679234362794914108033574681292656522807928680812726462195077833184018122369579002715900477290345396065912536529290811962117814900448319776590712946259540382461632468634827959957286905806432005632864663985014872365672653476822833921870071851313424903481282350342304819149894610089804321405589433980650340610521659031234826823369114800150883988613877877881069579
c = 11017336122691034053241992293963114590816319844384287448629663672049205892828600396465505710922907685545939978376321927394655458727494361852952898280905220963163625482295222856129164172619564344634365520328815972232825639292605311741655988427166811406091329613627961070231457035303298793651546412496975662225857123805867756651901374507447803198638466304862480202099076813471571495380132563252630789218173007275890600746758285415274434393381125742526014986039652677605642226576741424053749512280825231217420239089105794080707322357602941046822659335487420672699022969372037662958497832065752272061853723653365171768556
e = 65537
p_low = pxor & ((1<<400)-1)
p_high = pxor>>752
pbits = 1024
kbits = pbits - p_high.nbits()-p_low.nbits()
PR.<x> = PolynomialRing(Zmod(n))
f = p_high * 2 ^ 752 + x * 2 ^400 + p_low
p0 = f.monic().small_roots(X = 2 ^ 352,beta = 0.4)[0]
p = p_high * 2 ^ 752 + p0 * 2 ^400 + p_low
#这里注意一下,一定要把位数给加上啊,就是p_high * 2 ^ 752后面这个,2^752不要忘记了,我当时就给忘记了,导致一直出不来,而且最后的时候我直接print(p_high + p0 + p_low)了,当时真的出不来,明明就差一点,一直看不出来问题,悲伤,后来晚上从图书馆回来才发现了这个低级的错误。
print(p)#124229245244085791439650934438639686782423445183921252684721764061493908790073948870293397345832864335042475785728973083585314359884258149847711858397514908905613053545356103378803167400248049812953390169260920922532533579636992286759858305144877980057956578200502522929436738617263575249394601586523948318247
#这里求出p之后直接rsa出flag
q = n // p
phi = (q-1)*(p-1)
d = pow(e,-1,phi)
m = pow(c,d,n)
print(long_to_bytes(m))
#SYC{2f521b13bc9d6e932e9f5cbe511112df9e3a9c6}
LinkedListModular:
此题为re+crypto,前面的部分是re的部分,是队友(vstral)做的,下面放一下vstral的过程:
本题⽤到了⼤量的 GMP 库函数和链表结构
check 函数中,涉及到了多个加密和数学运算
在 write_enc_cmp_to_file 函数中,将传⼊的数据(以 a2 作为起始地址, a3 为⻓度的字节数据写⼊到⽂件中,并以 特定格式保存)。主要作⽤是将⼀个字节流按⼗六进制格式写⼊⽂件
- a1 :这是⼀个整数,表⽰⽂件名的编号。
- a2 :这是⼀个指针,指向要写⼊⽂件的数据的起始地址。
- a3 :表⽰要写⼊的数据的字节数。
⾸先分配了空间,然后通过 sprintf 将 a1 格式化⽣成⽂件名,然后⽤ fprintf 将每个字节以⼗六进制格式写⼊到⽂件中
逆向过程:
先将加密后写⼊⽂件的数据提取,然后将 enc 通过密钥解密并且分段输出 p , q , e , c
enc0 = [0x39,0x71,0x5e,0x17,0x16,0x3c,0x5e,0x10,0x75,0x5f,0x0a,0x50,0x73,0x43,0x1b,0x40,0x47,0x59,0x79,0x29,0x0a,0x56,0x14,0x38,0x5b,0x47,0x7f,0x0f,0x59,0x01,0x7a,0x41,0x4f,0x46,0x11,0x58,0x2a,0x7b,0x5f,0x0c,0x42,0x6f,0x0a,0x47,0x28,0x59,0x59,0x01,0x27,0x40,0x49,0x15,0x12,0x09,0x2a,0x7f,0x0d,0x5d,0x4e,0x69,0x0a,0x4d,0x2e,0x0b,0x0f,0x57,0x20,0x11,0x4c,0x43,0x16,0x0d,0x7b,0x2a,0x58,0x5a,0x15,0x6c,0x5d,0x43,0x7e,0x0c,0x59,0x50,0x77,0x46,0x48,0x48,0x10,0x58,0x79,0x7d,0x5d,0x5c,0x42,0x6e,0x5f,0x4d,0x29,0x0b,0x0f,0x52,0x72,0x41,0x1a,0x16,0x4d,0x09,0x28,0x28,0x5e,0x5b,0x11,0x3b,0x5e,0x47,0x7c,0x50,0x0f,0x53,0x75,0x44,0x18,0x14,0x17,0x59,0x2c,0x29,0x0c,0x59,0x11,0x3c,0x0a,0x4d,0x2f,0x50,0x5c,0x04,0x7b,0x16,0x1d,0x15,0x40,0x0c,0x7b,0x78,0x0a,0x5c,0x40,0x69,0x5b,0x44,0x75,0x51,0x0d,0x5c,0x72,0x4a,0x1d,0x15,0x40,0x59,0x2f,0x2e,0x58,0x56,0x16,0x69,0x0b,0x41,0x28,0x5e,0x53,0x52,0x7b,0x41,0x4d,0x41,0x17,0x5d,0x7c,0x7a,0x5f,0x57,0x12,0x6e,0x0b,0x44,0x2d,0x0a,0x58,0x53,0x7b,0x45,0x4c,0x43,0x17,0x0a,0x7d,0x7e,0x08,0x58,0x40,0x3b,0x59,0x41,0x79,0x51,0x5b,0x00,0x73,0x13,0x41,0x49,0x11,0x5c,0x79,0x7b,0x0f,0x0c,0x4f,0x3f,0x5e,0x17,0x29,0x5e,0x5e,0x01,0x70,0x13,0x49,0x40,0x45,0x0b,0x2f,0x79,0x58,0x0d,0x14,0x3f,0x0b,0x14,0x2a,0x51,0x59,0x04,0x77,0x45,0x40,0x15,0x45,0x5b,0x2f,0x7d,0x08,0x5d,0x42,0x3b,0x09,0x17,0x6c,0x18,0x51,0x55,0x3b,0x11,0x1f,0x13,0x47,0x5c,0x7e,0x2e,0x57,0x5d,0x46,0x6e,0x5a,0x41,0x79,0x0d,0x5b,0x54,0x21,0x13,0x1b,0x12,0x44,0x5f,0x2a,0x78,0x5d,0x5f,0x40,0x6d,0x58,0x14,0x29,0x0d,0x5f,0x00,0x75,0x16,0x40,0x49,0x10,0x09,0x7d,0x79,0x56,0x56,0x45,0x3b,0x09,0x13,0x2f,0x0c,0x58,0x5d,0x26,0x4b,0x1b,0x45,0x17,0x57,0x28,0x73,0x57,0x0b,0x47,0x6c,0x5d,0x4d,0x2d,0x5e,0x0f,0x04,0x22,0x11,0x41,0x14,0x44,0x5f,0x7e,0x7e,0x0a,0x58,0x45,0x61,0x5e,0x46,0x7a,0x5f,0x52,0x07,0x20,0x41,0x4a,0x42,0x42,0x57,0x71,0x28,0x57,0x09,0x41,0x3d,0x09,0x47,0x7b,0x50,0x58,0x07,0x70,0x4b,0x4a,0x45,0x4c,0x5f,0x28,0x28,0x59,0x5e,0x11,0x69,0x5a,0x11,0x2e,0x58,0x5e,0x5c,0x26,0x40,0x1d,0x15,0x11,0x5c,0x28,0x7d,0x08,0x0b,0x44,0x6d,0x0c,0x14,0x7e,0x0b,0x0a,0x50,0x20,0x11,0x18,0x15,0x4c,0x5b,0x7b,0x73,0x0b,0x09,0x12,0x3f,0x0b,0x43,0x29,0x0c,0x5e,0x51,0x76,0x46,0x1b,0x46,0x43,0x5a,0x78,0x28,0x0f,0x58,0x46,0x3a,0x5f,0x45,0x74,0x5d,0x5d,0x5d,0x71,0x45,0x41,0x14,0x43,0x09,0x2c,0x72,0x5f,0x5e,0x12,0x61,0x0c,0x47,0x75,0x5b,0x5a,0x52,0x71,0x14,0x18,0x47,0x43,0x5b,0x7f,0x73,0x0b,0x56,0x4e,0x6f,0x0b,0x4d,0x7c,0x0f,0x5f,0x53,0x75,0x43,0x1a,0x42,0x40,0x0c,0x2a,0x2f,0x0d,0x0c,0x40,0x6f,0x0c,0x43,0x79,0x5c,0x0a,0x5c,0x72,0x44,0x41,0x12,0x44,0x0a,0x2d,0x2e,0x0b,0x0b,0x46,0x6f,0x5a,0x17,0x7e,0x0d,0x0f,0x5d,0x7a,0x47,0x49,0x41,0x16,0x4f,0x2c,0x71,0x5e,0x17,0x13,0x6a,0x5d,0x47,0x6c,0x0a,0x51,0x55,0x3b,0x44,0x1f,0x42,0x47,0x0b,0x2a,0x7d,0x5d,0x5c,0x40,0x6d,0x59,0x10,0x2f,0x0d,0x5d,0x03,0x75,0x10,0x4f,0x13,0x43,0x5a,0x7a,0x7e,0x5b,0x59,0x16,0x60,0x59,0x4c,0x28,0x0c,0x0f,0x52,0x25,0x4b,0x49,0x43,0x47,0x0d,0x7e,0x7d,0x5f,0x58,0x13,0x6d,0x5b,0x4c,0x7b,0x0b,0x58,0x04,0x70,0x13,0x1a,0x46,0x4c,0x5a,0x2b,0x72,0x5c,0x5f,0x41,0x6a,0x0a,0x41,0x7e,0x0a,0x5e,0x53,0x76,0x45,0x18,0x40,0x45,0x59,0x79,0x7f,0x0b,0x0b,0x47,0x61,0x5b,0x45,0x7f,0x5c,0x5d,0x56,0x74,0x46,0x4d,0x40,0x4c,0x57,0x70,0x29,0x0a,0x59,0x4f,0x6f,0x5a,0x41,0x78,0x50,0x5b,0x57,0x72,0x13,0x48,0x45,0x10,0x09,0x28,0x78,0x5d,0x0a,0x13,0x6b,0x0b,0x4c,0x79,0x5a,0x5a,0x03,0x76,0x42,0x1a,0x44,0x45,0x0b,0x7d,0x7e,0x5c,0x0b,0x11,0x6e,0x5c,0x4c,0x75,0x5c,0x5e,0x51,0x22,0x41,0x4c,0x16,0x40,0x5c,0x7d,0x7b,0x57,0x56,0x44,0x3d,0x59,0x41,0x2f,0x50,0x0e,0x54,0x20,0x45,0x1b,0x45,0x40,0x57,0x70,0x7f,0x0a,0x5d,0x4e,0x68,0x0d,0x46,0x7f,0x08,0x08,0x5c,0x76,0x10,0x4a,0x49,0x43,0x5e,0x70,0x7b,0x57,0x5c,0x13,0x6e,0x57,0x4d,0x2d,0x58,0x0f,0x57,0x72,0x4a,0x1f,0x45,0x40,0x09,0x79,0x7b,0x5a,0x56,0x43,0x60,0x56,0x45,0x2a,0x51,0x0a,0x03,0x25,0x41,0x1d,0x40,0x4d,0x0a,0x7b,0x7a,0x0b,0x0b,0x16,0x3c,0x5d,0x44,0x7b,0x5b,0x08,0x01,0x7b,0x10,0x4d,0x42,0x15,0x0a,0x7f,0x2d,0x56,0x0e,0x15,0x3f,0x0b,0x17,0x7c,0x5c,0x0e,0x50,0x27,0x4b,0x18,0x46,0x12,0x09,0x7d,0x29,0x5b,0x5f,0x4e,0x6b,0x09,0x43,0x7c,0x0f,0x53,0x06,0x26,0x40,0x18,0x45,0x43,0x59,0x2c,0x7f,0x5c,0x56,0x16,0x61,0x5f,0x17,0x28,0x58,0x5e,0x03,0x20,0x45,0x49,0x47,0x47,0x0b,0x7e,0x7e,0x5a,0x5e,0x42,0x3a,0x57,0x47,0x78,0x0f,0x08,0x51,0x76,0x42,0x18,0x49,0x46,0x56,0x7c,0x7a,0x5c,0x57,0x12,0x6a,0x5f,0x4d,0x7c,0x5d,0x5c,0x53,0x73,0x43,0x4e,0x49,0x16,0x0c,0x7a,0x79,0x5f,0x5c,0x16,0x3d,0x0a,0x44,0x7d,0x5b,0x5a,0x01,0x75,0x43,0x4c,0x16,0x43,0x0a,0x2b,0x29,0x08,0x5e,0x4e,0x6b,0x09,0x4c,0x7f,0x0d,0x0f,0x57,0x76,0x42,0x4a,0x41,0x10,0x0a,0x78,0x79,0x0b,0x5e,0x45,0x3c,0x5e,0x40,0x2d,0x0c,0x5a,0x5d,0x7a,0x16,0x1b,0x45,0x46,0x5a,0x2d,0x2f,0x0c,0x0b,0x11,0x3b,0x5d,0x13,0x79,0x5d,0x0d,0x55,0x7a,0x4a,0x1a,0x40,0x15,0x5f,0x7b,0x7c,0x0c,0x59,0x15,0x68,0x5d,0x42,0x7b,0x0a,0x59,0x57,0x72,0x42,0x41,0x14,0x12,0x0b,0x7b,0x7d,0x57,0x56,0x11,0x6e,0x56,0x41,0x7a,0x0a,0x0e,0x50,0x72,0x14,0x48,0x13,0x43,0x5c,0x28,0x7c,0x56,0x58,0x45,0x68,0x57,0x4c,0x7a,0x0b,0x0f,0x5d,0x21,0x13,0x18,0x43,0x16,0x58,0x2f,0x2a,0x5a,0x0b,0x11,0x3a,0x5f,0x43,0x7f,0x08,0x09,0x57,0x72,0x40,0x1c,0x12,0x44,0x59,0x71,0x7f,0x5b,0x5c,0x46,0x3f,0x5c,0x42,0x7e,0x0f,0x59,0x00,0x27,0x11,0x4e,0x12,0x45,0x09,0x7e,0x29,0x0f,0x0e,0x44,0x6a,0x5a,0x46,0x2e,0x5c,0x5e,0x06,0x20,0x45,0x4c,0x40,0x16,0x56,0x7c,0x2d,0x08]
enc1 = [0x39,0x71,0x5e,0x17,0x40,0x38,0x58,0x17,0x74,0x0c,0x0e,0x52,0x71,0x16,0x4d,0x46,0x43,0x0a,0x2c,0x2d,0x0b,0x5c,0x40,0x61,0x5a,0x45,0x7e,0x0a,0x0a,0x52,0x7b,0x42,0x4d,0x15,0x44,0x0d,0x7c,0x7e,0x0b,0x5f,0x15,0x6f,0x57,0x4c,0x74,0x5e,0x0f,0x01,0x74,0x17,0x41,0x13,0x44,0x5c,0x2f,0x7c,0x08,0x58,0x11,0x6e,0x5e,0x42,0x79,0x5c,0x5f,0x54,0x7b,0x41,0x1d,0x42,0x15,0x5f,0x2d,0x72,0x57,0x0c,0x40,0x3b,0x5c,0x46,0x29,0x51,0x0e,0x54,0x22,0x40,0x41,0x12,0x11,0x5e,0x7e,0x7a,0x0c,0x58,0x40,0x3f,0x57,0x4c,0x7b,0x5d,0x5d,0x54,0x75,0x13,0x1a,0x44,0x4d,0x59,0x7d,0x7e,0x0a,0x58,0x13,0x6c,0x0c,0x13,0x7a,0x0f,0x0e,0x50,0x25,0x46,0x1d,0x13,0x16,0x09,0x2d,0x7a,0x0a,0x5d,0x42,0x3a,0x5c,0x14,0x28,0x5e,0x5e,0x00,0x72,0x17,0x1b,0x43,0x11,0x5b,0x79,0x78,0x56,0x0b,0x42,0x6c,0x0e,0x47,0x75,0x0a,0x5c,0x54,0x72,0x46,0x1c,0x41,0x43,0x59,0x2f,0x2f,0x5d,0x5b,0x41,0x6b,0x59,0x16,0x7e,0x08,0x53,0x00,0x74,0x44,0x49,0x42,0x45,0x0b,0x79,0x7c,0x57,0x0c,0x13,0x3b,0x57,0x40,0x2f,0x0a,0x53,0x55,0x72,0x44,0x18,0x13,0x15,0x0d,0x79,0x7b,0x5e,0x5b,0x40,0x60,0x5e,0x45,0x28,0x0f,0x0a,0x50,0x20,0x16,0x49,0x44,0x47,0x56,0x28,0x78,0x0d,0x0c,0x46,0x6a,0x5a,0x47,0x7b,0x5c,0x5e,0x52,0x26,0x13,0x41,0x47,0x4d,0x0c,0x78,0x73,0x5a,0x5b,0x42,0x6d,0x0e,0x41,0x78,0x5a,0x5c,0x54,0x72,0x42,0x41,0x43,0x15,0x5b,0x2f,0x72,0x0a,0x5e,0x13,0x6d,0x59,0x17,0x6c,0x18,0x51,0x55,0x3b,0x11,0x48,0x47,0x17,0x58,0x28,0x7c,0x08,0x0d,0x14,0x6c,0x5b,0x43,0x75,0x08,0x0d,0x51,0x72,0x41,0x1f,0x47,0x4d,0x0c,0x79,0x7c,0x0d,0x0c,0x42,0x3b,0x57,0x4c,0x7e,0x0a,0x0d,0x07,0x21,0x13,0x18,0x40,0x44,0x56,0x7c,0x7b,0x0c,0x5e,0x46,0x6c,0x0a,0x47,0x7a,0x5e,0x0e,0x5d,0x70,0x17,0x4b,0x46,0x42,0x56,0x2f,0x78,0x08,0x59,0x40,0x6e,0x56,0x16,0x7b,0x5a,0x5b,0x57,0x26,0x11,0x1f,0x13,0x4d,0x09,0x71,0x7e,0x5e,0x0a,0x47,0x3c,0x5b,0x44,0x74,0x5c,0x53,0x5c,0x71,0x17,0x40,0x46,0x10,0x5c,0x7c,0x7d,0x0a,0x59,0x42,0x3b,0x5e,0x11,0x7f,0x5e,0x59,0x51,0x70,0x40,0x1a,0x45,0x15,0x5c,0x2f,0x79,0x57,0x58,0x14,0x3f,0x0d,0x4d,0x7f,0x5e,0x58,0x03,0x26,0x4b,0x18,0x40,0x4d,0x5f,0x28,0x78,0x08,0x57,0x13,0x38,0x0b,0x13,0x7a,0x0c,0x0d,0x53,0x25,0x40,0x1a,0x11,0x41,0x0d,0x7c,0x7a,0x5e,0x58,0x43,0x6c,0x5b,0x10,0x29,0x5f,0x09,0x54,0x70,0x4a,0x4c,0x14,0x45,0x59,0x7c,0x29,0x0c,0x5b,0x15,0x3b,0x58,0x42,0x7b,0x5f,0x08,0x07,0x21,0x11,0x1a,0x12,0x4c,0x0b,0x2c,0x7a,0x57,0x56,0x44,0x38,0x5a,0x10,0x2e,0x0b,0x58,0x51,0x26,0x17,0x4a,0x46,0x41,0x09,0x2f,0x78,0x57,0x0d,0x4e,0x3c,0x0c,0x4c,0x7a,0x58,0x58,0x54,0x71,0x43,0x1b,0x11,0x4d,0x56,0x2d,0x7c,0x5a,0x58,0x42,0x60,0x0a,0x45,0x2e,0x0f,0x53,0x55,0x74,0x40,0x4f,0x48,0x44,0x5a,0x2a,0x2e,0x5e,0x5c,0x12,0x3d,0x58,0x13,0x7d,0x0c,0x5f,0x5c,0x70,0x45,0x4c,0x16,0x45,0x4f,0x2c,0x71,0x5e,0x17,0x46,0x69,0x0e,0x10,0x6c,0x0a,0x51,0x55,0x3b,0x47,0x1b,0x15,0x44,0x0b,0x2f,0x78,0x0c,0x0d,0x45,0x6d,0x5f,0x13,0x2a,0x0d,0x5e,0x56,0x25,0x40,0x1d,0x49,0x45,0x5b,0x2c,0x29,0x59,0x56,0x4f,0x6e,0x57,0x47,0x7f,0x58,0x53,0x57,0x72,0x13,0x48,0x14,0x16,0x0e,0x7c,0x28,0x0d,0x5b,0x4e,0x68,0x0e,0x4d,0x74,0x51,0x08,0x5d,0x25,0x16,0x4c,0x45,0x47,0x0e,0x70,0x7b,0x5b,0x0e,0x40,0x3f,0x5e,0x16,0x29,0x08,0x59,0x52,0x76,0x42,0x1a,0x43,0x4d,0x0a,0x28,0x7f,0x56,0x0e,0x15,0x6d,0x5e,0x42,0x79,0x58,0x5a,0x50,0x76,0x4b,0x48,0x43,0x45,0x5f,0x2a,0x7b,0x08,0x56,0x13,0x6f,0x5c,0x10,0x7d,0x08,0x0e,0x00,0x7a,0x16,0x4b,0x44,0x4c,0x5f,0x7e,0x73,0x5e,0x09,0x44,0x3a,0x0a,0x41,0x2a,0x50,0x53,0x06,0x76,0x45,0x48,0x41,0x40,0x0c,0x2d,0x79,0x57,0x5f,0x46,0x3c,0x0e,0x43,0x2a,0x5c,0x5d,0x55,0x26,0x42,0x4d,0x11,0x44,0x0e,0x70,0x28,0x0b,0x0c,0x46,0x6c,0x58,0x11,0x2d,0x0a,0x58,0x01,0x26,0x14,0x4e,0x43,0x40,0x09,0x28,0x7a,0x5e,0x0e,0x15,0x6c,0x5b,0x16,0x7e,0x5e,0x09,0x03,0x71,0x42,0x4b,0x41,0x45,0x0c,0x2f,0x7a,0x08,0x5e,0x11,0x6f,0x09,0x43,0x2d,0x0f,0x0e,0x50,0x25,0x11,0x40,0x15,0x12,0x5a,0x2a,0x72,0x0f,0x09,0x4f,0x6f,0x5b,0x13,0x7c,0x5c,0x5f,0x04,0x76,0x17,0x4f,0x41,0x17,0x5b,0x71,0x28,0x58,0x0a,0x41,0x3d,0x0c,0x45,0x74,0x5e,0x08,0x06,0x70,0x47,0x49,0x40,0x44,0x57,0x2d,0x7f,0x5c,0x5c,0x45,0x3d,0x5f,0x4d,0x2e,0x59,0x09,0x50,0x73,0x43,0x48,0x49,0x46,0x5c,0x2f,0x7a,0x5e,0x58,0x40,0x3c,0x0e,0x11,0x7b,0x5c,0x0f,0x50,0x77,0x13,0x4e,0x49,0x46,0x0e,0x28,0x73,0x0f,0x5a,0x46,0x38,0x5f,0x17,0x7f,0x5e,0x09,0x03,0x22,0x41,0x1f,0x11,0x11,0x09,0x79,0x29,0x57,0x5c,0x4f,0x69,0x0c,0x13,0x2a,0x5b,0x5b,0x5c,0x20,0x45,0x1b,0x16,0x47,0x0e,0x7b,0x7b,0x08,0x0d,0x15,0x3b,0x5f,0x4d,0x7b,0x0a,0x0a,0x03,0x72,0x45,0x4e,0x12,0x4c,0x5c,0x2a,0x72,0x0c,0x09,0x47,0x6a,0x0a,0x4c,0x7a,0x5c,0x09,0x01,0x74,0x41,0x4d,0x47,0x10,0x0b,0x78,0x73,0x5a,0x5e,0x4f,0x3f,0x5c,0x10,0x79,0x59,0x0a,0x00,0x25,0x40,0x40,0x13,0x17,0x57,0x70,0x2d,0x0f,0x5a,0x4e,0x6d,0x0c,0x16,0x28,0x5a,0x5a,0x07,0x75,0x14,0x4f,0x43,0x12,0x5c,0x70,0x7c,0x0b,0x0a,0x15,0x38,0x58,0x44,0x7a,0x5b,0x52,0x03,0x26,0x11,0x4b,0x13,0x4c,0x59,0x70,0x72,0x5f,0x5b,0x4f,0x3d,0x09,0x11,0x7a,0x0b,0x0e,0x56,0x71,0x16,0x1c,0x12,0x4d,0x59,0x7c,0x7c,0x59,0x59,0x4e,0x69,0x57,0x44,0x78,0x0b,0x09,0x51,0x25,0x17,0x4f,0x14,0x16,0x0a,0x2f,0x2e,0x5c,0x5c,0x40,0x60,0x5b,0x43,0x74,0x0c,0x5b,0x00,0x70,0x43,0x4e,0x11,0x4c,0x58,0x79,0x7c,0x57,0x5a,0x15,0x38,0x5f,0x41,0x2d,0x0b,0x59,0x00,0x70,0x42,0x4f,0x16,0x11,0x5a,0x7a,0x7f,0x5e,0x58,0x47,0x69,0x0c,0x41,0x7d,0x5c,0x5b,0x51,0x7b,0x17,0x1f,0x16,0x41,0x56,0x79,0x72,0x0f,0x5d,0x43,0x6c,0x5c,0x42,0x79,0x5b,0x53,0x51,0x76,0x47,0x4e,0x42,0x15,0x5f,0x70,0x78,0x5f]
enc2 = [0x39,0x71,0x5e,0x17,0x16,0x6b,0x5a,0x43,0x7e,0x0b,0x5e,0x56,0x21,0x43,0x1f,0x16,0x4c,0x0d,0x70,0x7d,0x5d,0x5a,0x46,0x6b,0x5d,0x16,0x75,0x5b,0x5d,0x54,0x71,0x16,0x41,0x12,0x42,0x0a,0x28,0x7f,0x5d,0x0e,0x14,0x69,0x0a,0x41,0x7c,0x58,0x5a,0x50,0x20,0x42,0x4a,0x12,0x11,0x09,0x2a,0x7b,0x08,0x0d,0x46,0x3b,0x0b,0x10,0x2a,0x0a,0x0f,0x04,0x70,0x47,0x18,0x47,0x43,0x09,0x78,0x28,0x08,0x5d,0x44,0x3c,0x5a,0x13,0x28,0x0f,0x0a,0x50,0x72,0x17,0x1c,0x48,0x42,0x5b,0x2d,0x2a,0x0d,0x58,0x47,0x6e,0x5a,0x47,0x78,0x5c,0x53,0x51,0x20,0x14,0x4d,0x42,0x40,0x5c,0x2a,0x2a,0x0a,0x0a,0x44,0x6f,0x0a,0x14,0x7c,0x0b,0x59,0x06,0x26,0x43,0x4d,0x14,0x4d,0x5c,0x7a,0x7c,0x0a,0x58,0x4e,0x6f,0x09,0x4d,0x79,0x0b,0x5c,0x56,0x73,0x46,0x41,0x43,0x11,0x58,0x2b,0x7d,0x0b,0x5c,0x43,0x6b,0x0b,0x41,0x78,0x08,0x58,0x53,0x22,0x43,0x1b,0x13,0x40,0x5f,0x7c,0x79,0x5f,0x5d,0x42,0x3b,0x5b,0x10,0x2d,0x0c,0x0d,0x56,0x74,0x40,0x4d,0x11,0x12,0x56,0x2a,0x2d,0x0c,0x57,0x14,0x38,0x0d,0x42,0x7d,0x50,0x0f,0x5c,0x26,0x14,0x1a,0x45,0x40,0x0b,0x2f,0x73,0x5b,0x5e,0x47,0x6d,0x5d,0x41,0x7c,0x51,0x08,0x57,0x25,0x44,0x40,0x13,0x45,0x0a,0x7c,0x2d,0x5a,0x59,0x11,0x69,0x5f,0x13,0x7c,0x5f,0x5c,0x03,0x74,0x14,0x18,0x45,0x17,0x09,0x7e,0x2a,0x5d,0x0c,0x15,0x6b,0x5d,0x42,0x74,0x5e,0x52,0x06,0x21,0x16,0x1c,0x16,0x15,0x0c,0x7e,0x2e,0x0f,0x0d,0x41,0x3a,0x0b,0x46,0x6c,0x18,0x51,0x55,0x3b,0x14,0x1c,0x15,0x17,0x5e,0x7b,0x2f,0x5a,0x59,0x47,0x6b,0x0a,0x41,0x74,0x50,0x5e,0x03,0x76,0x41,0x4e,0x41,0x41,0x0b,0x7e,0x2e,0x5b,0x0e,0x40,0x6c,0x57,0x46,0x29,0x0c,0x52,0x56,0x20,0x46,0x40,0x40,0x43,0x56,0x7d,0x73,0x5e,0x0e,0x16,0x3d,0x0e,0x10,0x7d,0x5a,0x08,0x52,0x20,0x4b,0x1d,0x47,0x46,0x5f,0x28,0x7e,0x08,0x0b,0x4e,0x6e,0x59,0x17,0x7a,0x0b,0x52,0x04,0x20,0x47,0x1c,0x16,0x42,0x5a,0x7c,0x7c,0x5e,0x09,0x4e,0x3c,0x56,0x11,0x75,0x0b,0x5d,0x01,0x73,0x10,0x49,0x12,0x47,0x56,0x2f,0x7a,0x5d,0x58,0x45,0x3c,0x0e,0x4d,0x7d,0x50,0x09,0x06,0x72,0x46,0x1a,0x13,0x45,0x5f,0x28,0x7b,0x0f,0x5d,0x44,0x38,0x58,0x13,0x7e,0x5b,0x0d,0x53,0x73,0x11,0x48,0x11,0x40,0x09,0x2a,0x7e,0x5d,0x59,0x12,0x3b,0x0c,0x41,0x75,0x50,0x5c,0x07,0x21,0x4a,0x4e,0x43,0x10,0x0d,0x70,0x2f,0x56,0x0c,0x15,0x6a,0x5b,0x13,0x79,0x51,0x0d,0x00,0x20,0x40,0x18,0x40,0x41,0x0b,0x2a,0x7c,0x58,0x59,0x14,0x3b,0x57,0x43,0x79,0x0c,0x5b,0x5c,0x22,0x13,0x4f,0x13,0x45,0x0e,0x79,0x7e,0x57,0x58,0x46,0x6a,0x0c,0x16,0x2e,0x58,0x09,0x56,0x72,0x13,0x40,0x13,0x4d,0x57,0x7f,0x2e,0x0d,0x0b,0x43,0x3f,0x5b,0x40,0x28,0x0a,0x5e,0x56,0x20,0x4b,0x4c,0x15,0x47,0x5d,0x28,0x2e,0x58,0x0b,0x44,0x6e,0x5f,0x10,0x29,0x5a,0x5e,0x53,0x75,0x16,0x18,0x11,0x4c,0x0d,0x7c,0x2d,0x5b,0x0d,0x11,0x6f,0x09,0x10,0x79,0x0f,0x0a,0x57,0x73,0x11,0x1d,0x40,0x12,0x4f,0x2c,0x71,0x5e,0x17,0x14,0x69,0x5a,0x44,0x6c,0x0a,0x51,0x55,0x3b,0x13,0x4e,0x49,0x4c,0x0c,0x2b,0x7b,0x58,0x58,0x15,0x6e,0x5e,0x43,0x2d,0x0c,0x5a,0x56,0x7b,0x40,0x1d,0x42,0x44,0x58,0x79,0x2e,0x08,0x0d,0x4f,0x3b,0x0b,0x17,0x7b,0x58,0x5b,0x50,0x73,0x10,0x41,0x48,0x10,0x56,0x7c,0x7b,0x5d,0x0e,0x41,0x61,0x09,0x10,0x79,0x0c,0x53,0x50,0x72,0x4b,0x40,0x49,0x44,0x58,0x78,0x2e,0x5a,0x0a,0x12,0x60,0x09,0x42,0x7e,0x0a,0x53,0x5d,0x21,0x41,0x40,0x47,0x41,0x0b,0x2c,0x7b,0x57,0x0a,0x4f,0x3f,0x5b,0x46,0x7a,0x5c,0x5d,0x53,0x27,0x45,0x4c,0x16,0x4d,0x5f,0x2c,0x7d,0x5d,0x57,0x4f,0x3f,0x0b,0x11,0x2e,0x5a,0x5f,0x5c,0x74,0x10,0x48,0x15,0x4c,0x09,0x71,0x2d,0x58,0x0d,0x11,0x61,0x0e,0x11,0x7d,0x5a,0x08,0x01,0x70,0x47,0x49,0x44,0x44,0x0b,0x7f,0x29,0x5b,0x0d,0x44,0x3f,0x5d,0x10,0x7f,0x0b,0x0a,0x56,0x21,0x43,0x1d,0x14,0x10,0x09,0x78,0x7f,0x56,0x5f,0x47,0x61,0x5b,0x45,0x2e,0x59,0x09,0x03,0x21,0x42,0x41,0x16,0x46,0x5a,0x2b,0x7e,0x5b,0x5b,0x41,0x3a,0x0b,0x40,0x2d,0x5a,0x5f,0x55,0x71,0x47,0x1c,0x48,0x11,0x0e,0x28,0x2d,0x5c,0x57,0x4e,0x6d,0x58,0x4d,0x2f,0x5c,0x0d,0x54,0x21,0x4b,0x48,0x42,0x46,0x56,0x28,0x78,0x5f,0x0c,0x4e,0x61,0x5f,0x13,0x7b,0x5e,0x58,0x01,0x26,0x10,0x40,0x40,0x17,0x0c,0x79,0x7c,0x5b,0x5d,0x13,0x38,0x57,0x47,0x2d,0x08,0x5a,0x52,0x76,0x4a,0x4c,0x12,0x16,0x59,0x78,0x7d,0x08,0x0c,0x47,0x3b,0x5b,0x13,0x7c,0x5e,0x5f,0x5c,0x73,0x42,0x4a,0x11,0x47,0x59,0x2f,0x7a,0x5f,0x0e,0x14,0x3b,0x0b,0x11,0x78,0x0c,0x53,0x50,0x25,0x45,0x1b,0x40,0x4d,0x5d,0x2c,0x2e,0x5d,0x57,0x41,0x6d,0x57,0x46,0x79,0x0a,0x5a,0x55,0x75,0x41,0x18,0x16,0x17,0x0c,0x2d,0x29,0x08,0x5c,0x15,0x6c,0x57,0x40,0x74,0x5c,0x5e,0x04,0x73,0x41,0x1c,0x49,0x44,0x5b,0x2a,0x29,0x0d,0x56,0x14,0x6e,0x09,0x10,0x75,0x0d,0x53,0x53,0x73,0x43,0x48,0x11,0x45,0x5d,0x7a,0x7c,0x0b,0x5c,0x4e,0x6f,0x0a,0x41,0x29,0x5b,0x08,0x52,0x71,0x16,0x1c,0x15,0x17,0x58,0x7f,0x73,0x5c,0x56,0x13,0x3c,0x58,0x10,0x7a,0x5e,0x59,0x5d,0x71,0x11,0x1d,0x11,0x4c,0x59,0x28,0x29,0x0a,0x5c,0x43,0x61,0x0d,0x17,0x75,0x51,0x0a,0x04,0x20,0x47,0x1c,0x11,0x4c,0x5c,0x2f,0x78,0x59,0x5c,0x42,0x3a,0x58,0x45,0x2d,0x5b,0x52,0x03,0x77,0x47,0x1a,0x16,0x12,0x59,0x2b,0x7f,0x0c,0x58,0x41,0x3b,0x5f,0x46,0x2a,0x58,0x59,0x06,0x77,0x17,0x18,0x49,0x47,0x59,0x7a,0x7d,0x56,0x0b,0x46,0x6a,0x0d,0x14,0x7d,0x5c,0x0a,0x5d,0x74,0x16,0x18,0x44,0x45,0x59,0x28,0x72,0x5f,0x0d,0x12,0x69,0x5a,0x10,0x2e,0x08,0x0a,0x55,0x26,0x44,0x4e,0x15,0x45,0x5f,0x7e,0x7b,0x0b,0x5a,0x13,0x6e,0x0e,0x44,0x79,0x0f,0x5a,0x52,0x7b,0x11,0x4d,0x42,0x12,0x09,0x79,0x7e,0x0c,0x0e,0x15,0x69,0x0a,0x46,0x28,0x0c,0x5b,0x55,0x7a,0x14,0x49,0x40,0x16,0x57,0x2c,0x7f,0x0d,0x0a,0x14,0x3f,0x56,0x40,0x7c,0x0f,0x5c,0x57,0x76,0x42,0x4d,0x42,0x43,0x0a,0x78,0x79]
enc3 = [0x39,0x71,0x5e,0x17,0x15,0x69,0x59,0x16,0x7a,0x0a,0x59,0x04,0x20,0x41,0x4b,0x40,0x17,0x5a,0x7c,0x7e,0x0d,0x0c,0x43,0x3b,0x0c,0x40,0x2e,0x0a,0x53,0x5c,0x7a,0x45,0x4f,0x44,0x47,0x59,0x7c,0x73,0x5c,0x0b,0x12,0x6a,0x5c,0x11,0x7b,0x5e,0x5c,0x5d,0x7b,0x17,0x1d,0x40,0x11,0x0d,0x78,0x2e,0x5b,0x0d,0x40,0x6b,0x59,0x10,0x7e,0x5d,0x59,0x06,0x71,0x4a,0x40,0x40,0x11,0x0b,0x2c,0x7e,0x5e,0x0b,0x4e,0x68,0x57,0x11,0x7f,0x0b,0x5c,0x06,0x22,0x10,0x4e,0x44,0x45,0x5b,0x78,0x7e,0x5f,0x56,0x12,0x6d,0x5c,0x42,0x7a,0x58,0x0d,0x50,0x72,0x47,0x4c,0x49,0x44,0x5d,0x7e,0x72,0x08,0x0d,0x43,0x3f,0x0e,0x4d,0x7a,0x5e,0x5f,0x04,0x7a,0x46,0x1d,0x40,0x4d,0x57,0x7c,0x2a,0x0b,0x0b,0x11,0x38,0x5b,0x17,0x79,0x5d,0x5e,0x5d,0x73,0x41,0x49,0x47,0x40,0x5e,0x7f,0x2a,0x0f,0x5e,0x4f,0x61,0x57,0x45,0x7d,0x5c,0x0e,0x54,0x71,0x17,0x4b,0x45,0x47,0x59,0x7a,0x7e,0x5e,0x09,0x11,0x38,0x5b,0x44,0x74,0x5b,0x5b,0x56,0x72,0x44,0x48,0x12,0x41,0x09,0x2b,0x79,0x5a,0x5c,0x4f,0x69,0x5c,0x40,0x7d,0x5f,0x5b,0x56,0x71,0x45,0x1c,0x42,0x45,0x09,0x7d,0x7b,0x5f,0x5a,0x13,0x6d,0x0d,0x42,0x7f,0x50,0x58,0x01,0x7a,0x42,0x1f,0x16,0x12,0x5a,0x79,0x2d,0x56,0x0b,0x42,0x3b,0x0a,0x46,0x28,0x08,0x5b,0x5d,0x22,0x10,0x1c,0x16,0x15,0x0c,0x7b,0x78,0x56,0x56,0x4f,0x38,0x5a,0x40,0x28,0x0a,0x5d,0x55,0x22,0x40,0x4d,0x44,0x43,0x5f,0x2a,0x73,0x08,0x0a,0x40,0x6f,0x0a,0x17,0x6c,0x18,0x51,0x55,0x3b,0x13,0x1d,0x11,0x16,0x0c,0x7f,0x7a,0x5b,0x5e,0x4e,0x3c,0x56,0x43,0x78,0x5b,0x5e,0x54,0x74,0x17,0x1b,0x45,0x17,0x5d,0x28,0x7f,0x0f,0x5b,0x46,0x6f,0x09,0x46,0x78,0x0a,0x5d,0x57,0x22,0x40,0x1a,0x41,0x11,0x0e,0x7f,0x2e,0x0d,0x5b,0x14,0x68,0x0b,0x45,0x28,0x5d,0x5d,0x5d,0x75,0x13,0x40,0x45,0x17,0x5c,0x78,0x2f,0x0d,0x0e,0x15,0x3b,0x0e,0x47,0x2f,0x58,0x58,0x03,0x22,0x4a,0x4b,0x41,0x43,0x0a,0x78,0x7f,0x08,0x0c,0x42,0x6d,0x5e,0x4d,0x79,0x5e,0x09,0x5d,0x77,0x44,0x1d,0x48,0x4c,0x5f,0x7b,0x7c,0x0f,0x5e,0x11,0x6e,0x0c,0x13,0x29,0x0c,0x52,0x04,0x21,0x13,0x49,0x47,0x41,0x58,0x2a,0x78,0x0f,0x56,0x45,0x38,0x0d,0x40,0x7b,0x50,0x5b,0x5d,0x75,0x47,0x41,0x46,0x17,0x5f,0x2c,0x7e,0x5c,0x0d,0x4f,0x68,0x57,0x41,0x28,0x0c,0x5b,0x06,0x75,0x4b,0x18,0x15,0x42,0x58,0x7d,0x29,0x5e,0x5c,0x43,0x6a,0x5b,0x47,0x2e,0x59,0x0f,0x07,0x77,0x42,0x40,0x45,0x41,0x09,0x2b,0x2d,0x08,0x0b,0x14,0x61,0x5b,0x10,0x29,0x51,0x5c,0x50,0x21,0x4b,0x1b,0x48,0x40,0x09,0x7e,0x2f,0x5c,0x0d,0x11,0x6a,0x5d,0x4d,0x7f,0x5f,0x0d,0x55,0x70,0x11,0x4a,0x40,0x40,0x0d,0x7a,0x7f,0x08,0x0a,0x16,0x6b,0x0a,0x14,0x7c,0x5a,0x5c,0x56,0x72,0x13,0x1f,0x49,0x41,0x0b,0x70,0x7a,0x5b,0x59,0x15,0x60,0x5e,0x14,0x7d,0x5f,0x0d,0x03,0x7a,0x41,0x4a,0x48,0x12,0x0a,0x71,0x2a,0x57,0x09,0x14,0x3c,0x5d,0x41,0x79,0x5b,0x5e,0x07,0x75,0x47,0x4c,0x40,0x4d,0x4f,0x2c,0x71,0x5e,0x17,0x13,0x6b,0x0c,0x47,0x6c,0x0a,0x51,0x55,0x3b,0x43,0x48,0x48,0x42,0x5e,0x7e,0x7e,0x5c,0x0e,0x4f,0x3a,0x0e,0x40,0x74,0x0b,0x5c,0x52,0x74,0x41,0x49,0x40,0x11,0x09,0x2b,0x28,0x56,0x0a,0x13,0x69,0x5a,0x10,0x2d,0x5c,0x5f,0x01,0x73,0x11,0x4a,0x42,0x42,0x0c,0x2b,0x2d,0x0c,0x5a,0x40,0x6a,0x0e,0x45,0x2e,0x0d,0x59,0x54,0x25,0x17,0x4c,0x11,0x46,0x5f,0x78,0x72,0x5f,0x0d,0x47,0x6a,0x09,0x45,0x7b,0x0b,0x0e,0x52,0x22,0x17,0x18,0x49,0x15,0x0c,0x78,0x72,0x5c,0x0e,0x13,0x3b,0x0a,0x41,0x74,0x5e,0x59,0x53,0x22,0x42,0x18,0x40,0x47,0x0c,0x2a,0x28,0x56,0x5c,0x4f,0x6a,0x58,0x40,0x28,0x5e,0x08,0x51,0x25,0x11,0x1d,0x40,0x16,0x57,0x71,0x7a,0x5a,0x5a,0x40,0x61,0x09,0x14,0x28,0x5d,0x5c,0x00,0x22,0x42,0x4d,0x40,0x43,0x5d,0x71,0x7a,0x0c,0x0d,0x15,0x6b,0x5f,0x40,0x75,0x5f,0x5b,0x06,0x75,0x46,0x4c,0x43,0x12,0x09,0x2f,0x73,0x5f,0x5a,0x4f,0x6d,0x0c,0x10,0x7f,0x5a,0x5f,0x04,0x71,0x41,0x40,0x46,0x44,0x0c,0x7f,0x78,0x5c,0x5e,0x14,0x6e,0x5d,0x45,0x28,0x08,0x5c,0x07,0x72,0x4b,0x49,0x42,0x4c,0x5e,0x2a,0x7d,0x0a,0x5b,0x41,0x3b,0x5a,0x40,0x29,0x5a,0x09,0x04,0x21,0x42,0x4d,0x49,0x47,0x0b,0x71,0x2d,0x08,0x59,0x14,0x3f,0x5c,0x4d,0x79,0x5c,0x0a,0x57,0x22,0x44,0x49,0x43,0x4d,0x0c,0x7b,0x7e,0x57,0x09,0x4e,0x6c,0x5a,0x10,0x7e,0x0a,0x09,0x01,0x25,0x10,0x40,0x14,0x17,0x0e,0x2b,0x28,0x56,0x5e,0x44,0x38,0x0b,0x4d,0x7e,0x0a,0x5e,0x56,0x70,0x41,0x1d,0x45,0x47,0x5a,0x70,0x7e,0x5e,0x0a,0x45,0x61,0x0c,0x13,0x2e,0x5b,0x0a,0x04,0x76,0x47,0x4f,0x13,0x47,0x5d,0x7e,0x7b,0x5e,0x09,0x41,0x6d,0x0c,0x47,0x2e,0x5f,0x58,0x55,0x76,0x4a,0x1a,0x16,0x47,0x5c,0x2f,0x2e,0x58,0x0c,0x43,0x69,0x59,0x42,0x7b,0x08,0x52,0x56,0x27,0x4a,0x1a,0x48,0x44,0x0e,0x79,0x2d,0x57,0x0b,0x15,0x6f,0x5f,0x11,0x2d,0x58,0x08,0x00,0x7a,0x42,0x48,0x48,0x46,0x0a,0x2d,0x7b,0x0f,0x0e,0x41,0x3c,0x0b,0x46,0x7f,0x08,0x59,0x04,0x7a,0x40,0x41,0x48,0x10,0x0c,0x70,0x2d,0x08,0x5e,0x4e,0x3c,0x0b,0x4c,0x2e,0x0f,0x0d,0x07,0x76,0x4b,0x40,0x49,0x45,0x0d,0x2d,0x2f,0x08,0x5d,0x4f,0x6b,0x0d,0x46,0x74,0x08,0x5e,0x5c,0x27,0x17,0x1d,0x42,0x43,0x09,0x7e,0x7a,0x0d,0x5b,0x12,0x6c,0x0a,0x45,0x7d,0x50,0x5b,0x00,0x76,0x40,0x4d,0x44,0x10,0x56,0x78,0x7d,0x5b,0x5a,0x41,0x3a,0x5f,0x46,0x7f,0x0b,0x09,0x57,0x22,0x43,0x41,0x44,0x17,0x57,0x7e,0x28,0x08,0x5e,0x4e,0x6b,0x5c,0x13,0x2e,0x51,0x5c,0x5c,0x73,0x40,0x1f,0x11,0x4d,0x0b,0x2b,0x29,0x5b,0x0e,0x13,0x6c,0x09,0x4c,0x7e,0x5e,0x59,0x51,0x7a,0x10,0x1c,0x14,0x12,0x0e,0x7d,0x29,0x5a,0x58,0x12,0x6c,0x0e,0x46,0x7b,0x50,0x59,0x5c,0x74,0x4b,0x4b,0x46,0x11,0x5c,0x7b,0x7a,0x58,0x0e,0x4f,0x69,0x57,0x17,0x75,0x5a,0x0e,0x04,0x71,0x11,0x4e,0x12,0x12,0x5f,0x78,0x7f,0x0d,0x5f,0x15,0x6e,0x0e,0x10,0x7e,0x50,0x0e,0x04,0x20,0x14,0x4c,0x49,0x41,0x0e,0x7d,0x78,0x0b]
def crypt(data):
key = "IKnowYouLikeCrypto"
v10 = len(data)
result = ""
for i in range(v10):
data[i] ^= ord(key[i % 18])
data[i] = chr(data[i])
result += data[i]
return result
def turn(data):
location = []
for i in range(len(data)):
if data[i] == " ":
location.append(i)
p = data[:location[0]]
q = data[location[0]+1:location[1]]
e = data[location[1]+1:location[2]]
c = data[location[2]+1:]
p = int(p[2:],16)
q = int(q[2:],16)
e = int(e[2:],16)
c = int(c[2:],16)
return p, q, e, c
def output(data):
data = turn(crypt(data))
print("p = "+ str(data[0]))
print("q = "+ str(data[1]))
print("e = "+ str(data[2]))
print("c = "+ str(data[3]))
print("\nenc0的结果为:")
output(enc0)
print("\nenc1的结果为:")
output(enc1)
print("\nenc2的结果为:")
output(enc2)
print("\nenc3的结果为:")
output(enc3)
密码部分:
这里得到了四组p,q,e,c,但是题目提醒了注意e和phi,就知道了e和phi不互质,所以很简单的
enc0�Ľ��Ϊ��
p = 122270861290599578639045245855962543705730032630755185606879757206179711733753365147966963024978794275592619421652783145619018195586521233885682978373729799794310979858883407180862687141564775908815997081768279744281601978220649648570076155855057872071934647568517429940869409265220173220394958396829102922747
q = 145895839511071843328632553786312889050300087771516738662432330420448872465700664308309226114037360915656319628912705547767935389266619849150150441056011167554962792718447234998480891798333165313729924211768140920745823520187297704741938920310919784476251310206400453334805818184285230822153394899548512014363
e = 54050
c = 14030135514635598302794617424716291835816328683662639736248038724984547291821817259473592149765257404252757655788615493983340073369799283614267799122874068386483545369841536424720586065630488365125416323465659628220325230113595380678935117166076914407010605138044768627282116054287141762067469166512857628490621045347308961162010242614814641531660373325719065999031562248458476856972067741768151921225579744016300062897152743302145692689352793324795135401136498046047188121063247708395640777371548996062674320708390110447311929288206121760762410872526924579641318919472258601562794025337256187068455307563612901185023
enc1�Ľ��Ϊ��
p = 86010241306828695711315128924599735140271626506041901817784997674189297941853729364282050885284675170170821186690061333205093054758809155320992207244551279236901389783439594217221100781360422444116377542166763838467239709394816251633118839088171402103700954007772937216244712571543562096482264586237749875819
q = 135870661274724260761777656982848828868032325851948061776635650311711582931870434507059024120746651393755948511526211104639055783183197136990340032725326244689949152528703158984146195397743387805547644375182877781616481448740610009562687655041910892459867395655316615742128949396867439946390178637509880411633
e = 4270
c = 11598574270272630669714907360583133378706899622553239805344812166774743123206830402943691200503759695399591347094422594967770567057117248269726758467264312401133127715780819831501882369655128752151118270781981866484643528591517003660647218224315002479901416782305051851693962233968104493864345621514513889489988026466245490355297184507186588531101596026437796555886217059247337756496652510943309401703243002842025454251768433665133067967206291033448828322668417084410333992791255746157109331097709760150924142238375746555792880008101876932484326448226098739524995637966296227393399377617119263161025919164346792544561
enc2�Ľ��Ϊ��
p = 113996636277299533570182302103805270404328287588039359480117725799731468903729837871758089945224543747241332872053035409977686988828746257770577119441654973432267840909581546222729272312791011601321369417719086022464065509525953388164636951042845396223299823034634171347201104613118094684282180610968181763283
q = 179012430125443495243486068136135361221504157943761632954371910668630940409423204711355123693305413255114948345339274042082038162457949049106824669564814439501181874462870236637605932234845161478752403949944328541754810406699391028626685666316761083909928278039334844695628682088512654628951908784094717201679
e = 49233
c = 1322321374946524818652023720096939051768018158840573773662739229912717016596391549713276689400149946305546387707907323058608844811344367201330349195046716581714778505096098070215006674487247507334946756165794643707736833654141976843194322370706461949417335615521534451266831579666968022184721632924700931501823301459381927293501659690181802933722359094313659106322298471487330133269235036148809591432757124529202915730121032198174486512328435816936036772002230322906874285577303764890953815215779772380996339638756319626274531454590050226922831941419968900991324918796869830028048552466209680423495017341743205088786
enc3�Ľ��Ϊ��
p = 123888812740641928836168042326359816394975720485951831888838275274076617471071546431769283439173465908911537906450091397803657135440556050932230723993937394896061320470381209514964704945423660616750442602267012194575389456964026217997304524759607303104433720633388080425678353978941287094242434193955055630059
q = 121955917457499976375150103626761474166113111625393616609019476776085394161196238468185025413954055886598242407538128364904706744043310319400281880426622607966177170554459739351838972332013408544407052828843515726885278465751980156963483293699874070321302525920625454568002421588162549519570398808647199511817
e = 53954
c = 2212173972744047970990379804298933258334252251912942437533545314979358687449975375840376152127572741500667242076551697163529870996537676041038948227338266260926612489035397580103113172682245696555495676218185074197392305638733600231895438792687753022367399336104584002419428238425292877036252656179628594398438480118648680608266982741701265182418582127103364633630337738597016983834833305453465805338763525698753576429977848403451927698484187503450184378049543359003342835467612662169578981988940376898818772304771375667079867314152601395767452321011385597804726251559017443302250435057446590994585807118833643004990
from Crypto.Util.number import *
import gmpy2
p = 123888812740641928836168042326359816394975720485951831888838275274076617471071546431769283439173465908911537906450091397803657135440556050932230723993937394896061320470381209514964704945423660616750442602267012194575389456964026217997304524759607303104433720633388080425678353978941287094242434193955055630059
q = 121955917457499976375150103626761474166113111625393616609019476776085394161196238468185025413954055886598242407538128364904706744043310319400281880426622607966177170554459739351838972332013408544407052828843515726885278465751980156963483293699874070321302525920625454568002421588162549519570398808647199511817
e = 53954
c = 2212173972744047970990379804298933258334252251912942437533545314979358687449975375840376152127572741500667242076551697163529870996537676041038948227338266260926612489035397580103113172682245696555495676218185074197392305638733600231895438792687753022367399336104584002419428238425292877036252656179628594398438480118648680608266982741701265182418582127103364633630337738597016983834833305453465805338763525698753576429977848403451927698484187503450184378049543359003342835467612662169578981988940376898818772304771375667079867314152601395767452321011385597804726251559017443302250435057446590994585807118833643004990
n = q*p
e1 = e // 2
phi = (q - 1)
a = gmpy2.gcd(e,phi)
print(a)
d1 = gmpy2.invert(e1,phi)
m1 = pow(c,d1,q)
s = gmpy2.iroot(m1,2)[0]
print(s)
#这里只放了一个脚本,其他的三组和这个一模一样,但是有一组是互素的我记得,那就更简单了,没必要都列出来,然后就到了恶心的环节了
这个得出四组值之后,没有看到题目的提示,无论如何我都出不来啊当时,后面试错了无数次之后才看到题目的提示,然后老是想把拼一块去转hex,但发现就是不能够256,后面突然灵光乍现,觉得会不会是把四个m分别转hex然后加一块,wow~ ~~ 刚好是256,当时一早上都没有听课,一直在想这个,太悲伤了,然后打包转md5值,还有没注意flag的题头居然是flag而不是SYC,太悲伤了,当时差点破防,哈哈哈
import hashlib
enc0 =47278196062167541585455853280941033307618230193432284377294672427930775790940
enc1 = 6649739036131957280788032150850684705382994434372821202484300458163206934369
enc3 = 9168988683066850946264592811590831830063906088604167160562565578372116763563
enc4 =48464490238122893740346191745565682578473536991653209626280563589974254605724
enc0 = hex(enc0)[2:]
enc1 = hex(enc1)[2:]
enc3 = hex(enc3)[2:]
enc4 = hex(enc4)[2:]
print(enc0, enc1, enc3, enc4)
print("sum = %d", len(enc0) + len(enc1) + len(enc3) + len(enc4))
result = enc0 + enc1 + enc3 + enc4
result_md5 = hashlib.md5(result.encode()).hexdigest()
print("result = " + result_md5)
#flag{d3f06717efc6c0daf454ffeac9764687}
Comments | NOTHING