2023-SICTF-Round-2-WP

Radio

题目

from Crypto.Util.number import *
from flag import flag
m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n1 = p * q
p = getPrime(1024)
q = getPrime(1024)
n2 = p * q
p = getPrime(1024)
q = getPrime(1024)
n3 = p * q
e = 17
c1 = pow(m,e,n1)
c2 = pow(m,e,n2)
c3 = pow(m,e,n3)
print("n1 =",n1)
print("n2 =",n2)
print("n3 =",n3)
print("c1 =",c1)
print("c2 =",c2)
print("c3 =",c3)
'''
n1 = 14628911682936716611458501697007036859460044243525290515096052103585430459755335375005202100114469571371360084664887335211277585652711111523095037589648375630146039444071400098427638768750755153219974194380355807078158427824557754939604018020265955042573660474772006646525311705184431094905718137297923127124517126579859336516891364853724635334011666814712424599592662398013241607855160919361308195967978220182785816761656927836373944699635667244275310680450562446433724968942835275279255823144471582249379035668825437133182865600026935116686574740844588839352146024513673500770611055698030333734066230166111140083923 
n2 = 16756694748293603983474688536179571665757862433174984877308316444468003022266277794769268134195205510197588585566270416339902269736376811449830775290335951504698137924773942880807921752691668522662285163130340474205633998154849689387759453003838730282756734975490180702422176361373516245372635401939755527017589503572550811648345570775428936487145892225736625411540461653083957762795820510109891180906709827194217045059033312564525916136573856999724346161896146703174418039344166251503310869772735585554127509732135494936119159784702673291794381095696332128950979288440758815310482211285712819274848744478643590996499 
n3 = 12023158079717019193506148537498877243668782424904061914991928068483879707115315968983829360560644394409575645736275352836086080024994045582242629571839276759393418303915955798990522990081795218822313146157773272844272865701134880180795342597049645358985187689813369428579614193015028249821853347208001645148169449968882591709833452960545988520048722323580338213590245476892223967673180144525106292453573842357322398199104132677638909964034937501684668442732786408572501007756270725934445316827054687741612177409932320532825182104820899546084015733164816993674100635828218335112393003462442685677115798304835391938681 
c1 = 786426913645332991929803636719878643130489430090701482974255190570111407517277263761161970232982615374753982050075781017755721714929721429185828101898786972242994012456972241276851428750970754773002966788642795040933520662931514953660571657013642671173456750800960592586345219252277575624120271330470724245201080094330964145796872211627254805407394764183615099525852600855622089361965086460279057625205099471122036599934609091062009161119885692567925924978687256063116915630947838112126347748759078024890458539541208153526564434483654508834147071166870006117573542198238493913144419569943131642262575848786399020602    
c2 = 14269311999815379511888097227418748728398011595172649708273598243317106830139061994801598925448165045032084910971094414749744701731066555194159863759072739031915833091715422787808666326235589236328864675164322734119047182014621724868200908222400504845559290620275973427127376594365043386362821355037781568524903149101953873768462097165128186788759111090267131443645126715520994688945363059795513931799317608292977574376954729552861360597103229877031117089231816770880909815561950691603994439997197261395452797893557057320175747162837857668062550646101714062365530246698404923128445182100334335447738834779014705114350  
c3 = 3204718091370324153305164801961074660508922478706979436653573192321723216725523523538914956544950802616295043619768261075799875855502834749045520466140056621489305006966280527055668378303630674311102581232313032585389907028715671091914904062961720585667564982641321454541632782484415075257140508738041786400512095949826279576159569786734978545737717138115729502475357594151593143140355121154223614868465202149338507796306863351134218879326031985027900678671697876083351974546516576983143592764763925335805465720148057651958521255276602933604064541840892578409973858867533575728482926007556060584654853884046046420855 
'''

e = 17 e=17 e=17比较小,在相同 e e e的情况下对同一信息使用不同的模数 n n n进行 R S A RSA RSA加密,所以是低加密指数广播攻击。(核心是 C R T CRT CRT)

实现低加密指数广播攻击需要满足以下三个条件:

(1)加密指数e非常小。
(2)同一份明文使用不同的模数n,相同的加密指数e进行多次加密。
(3)攻击者可以得到每一份加密后的密文和对应的模数n、加密指数e。

解题思路

运用中国剩余定理。

设正整数 n 1 , n 2 , n 3 , . . . . . . . , n k n _{1} , n _{2} , n _{3},.......,n _{k} n1,n2,n3,.......,nk两两互素,对任意整数 c 1 , c 2 , c 3 , . . . . . . . , c n c_{1},c_{2},c_{3},.......,c_{n} c1,c2,c3,.......,cn,一次同余方程组
{ x ≡ c 1 m o d n 1 x ≡ c 2 m o d n 2 x ≡ c 3 m o d n 3 . . . x ≡ c n m o d n k \left\{\begin{matrix} x & \equiv & c_{1} & mod & n_{1}\\ x& \equiv & c_{2} & mod &n_{2} \\ x& \equiv & c_{3} & mod &n_{3} \\ ...& & & & \\ x&\equiv &c_{n} & mod &n_{k} \end{matrix}\right. xxx...xc1c2c3cnmodmodmodmodn1n2n3nk

在模N意义下存在唯一解,该解可表示为:
x ≡ N 1 ∗ d 1 ∗ c 1 + N 2 ∗ d 2 ∗ c 2 + N 3 ∗ d 3 ∗ c 3 + . . . N n ∗ d n ∗ c n m o d N x\equiv N_{1}*d_{1}*c_{1}+N_{2}*d_{2}*c_{2}+N_{3}*d_{3}*c_{3}+...N_{n}*d_{n}*c_{n}\mathbf{ }mod\mathbf{ }N xN1d1c1+N2d2c2+N3d3c3+...NndncnmodN
其中, n = n 1 ∗ n 2 ∗ n 3 ∗ . . . ∗ n k n=n_{1}*n_{2}*n_{3}*...*n_{k} n=n1n2n3...nk,

N i = N / n i N_{i}=N/n_{i} Ni=N/ni,

d i ≡ N i − 1   m o d   n i d_{i}\equiv N_{i}^{-1}\textbf{ }mod\textbf{ }n_{i} diNi1 mod ni

exp:

import gmpy2
from functools import reduce
from Crypto.Util.number import long_to_bytes

# 中国剩余定理
def CRT(cipher, n):
    N = reduce(lambda x, y: x * y, (i for i in n))
    result = 0
    data = zip(cipher, n)
    for ci, ni in data:
        Ni = N // ni
        di = gmpy2.invert(Ni, ni)
        result += ci * Ni * di
    return result % N, N


e = 17
c = [
    786426913645332991929803636719878643130489430090701482974255190570111407517277263761161970232982615374753982050075781017755721714929721429185828101898786972242994012456972241276851428750970754773002966788642795040933520662931514953660571657013642671173456750800960592586345219252277575624120271330470724245201080094330964145796872211627254805407394764183615099525852600855622089361965086460279057625205099471122036599934609091062009161119885692567925924978687256063116915630947838112126347748759078024890458539541208153526564434483654508834147071166870006117573542198238493913144419569943131642262575848786399020602,
    14269311999815379511888097227418748728398011595172649708273598243317106830139061994801598925448165045032084910971094414749744701731066555194159863759072739031915833091715422787808666326235589236328864675164322734119047182014621724868200908222400504845559290620275973427127376594365043386362821355037781568524903149101953873768462097165128186788759111090267131443645126715520994688945363059795513931799317608292977574376954729552861360597103229877031117089231816770880909815561950691603994439997197261395452797893557057320175747162837857668062550646101714062365530246698404923128445182100334335447738834779014705114350,
    3204718091370324153305164801961074660508922478706979436653573192321723216725523523538914956544950802616295043619768261075799875855502834749045520466140056621489305006966280527055668378303630674311102581232313032585389907028715671091914904062961720585667564982641321454541632782484415075257140508738041786400512095949826279576159569786734978545737717138115729502475357594151593143140355121154223614868465202149338507796306863351134218879326031985027900678671697876083351974546516576983143592764763925335805465720148057651958521255276602933604064541840892578409973858867533575728482926007556060584654853884046046420855
]
n = [
    14628911682936716611458501697007036859460044243525290515096052103585430459755335375005202100114469571371360084664887335211277585652711111523095037589648375630146039444071400098427638768750755153219974194380355807078158427824557754939604018020265955042573660474772006646525311705184431094905718137297923127124517126579859336516891364853724635334011666814712424599592662398013241607855160919361308195967978220182785816761656927836373944699635667244275310680450562446433724968942835275279255823144471582249379035668825437133182865600026935116686574740844588839352146024513673500770611055698030333734066230166111140083923,
    16756694748293603983474688536179571665757862433174984877308316444468003022266277794769268134195205510197588585566270416339902269736376811449830775290335951504698137924773942880807921752691668522662285163130340474205633998154849689387759453003838730282756734975490180702422176361373516245372635401939755527017589503572550811648345570775428936487145892225736625411540461653083957762795820510109891180906709827194217045059033312564525916136573856999724346161896146703174418039344166251503310869772735585554127509732135494936119159784702673291794381095696332128950979288440758815310482211285712819274848744478643590996499,
    12023158079717019193506148537498877243668782424904061914991928068483879707115315968983829360560644394409575645736275352836086080024994045582242629571839276759393418303915955798990522990081795218822313146157773272844272865701134880180795342597049645358985187689813369428579614193015028249821853347208001645148169449968882591709833452960545988520048722323580338213590245476892223967673180144525106292453573842357322398199104132677638909964034937501684668442732786408572501007756270725934445316827054687741612177409932320532825182104820899546084015733164816993674100635828218335112393003462442685677115798304835391938681
    ]
x, N = CRT(c, n)

m = gmpy2.iroot(gmpy2.mpz(x), e)[0]
print(m)
print(long_to_bytes(m))
# SICTF{fdc0afb5-1c81-46b9-a28a-241f5f64419d}

MingTianPao

题目

import binascii
from Crypto.Util.strxor import strxor
from secret import flag, message
# message is a Classic English Story

for i in range(10):
    tmp = (message[i*30:(i+1)*30].encode())
    print(binascii.hexlify(strxor(tmp,flag)).decode())

# 1f2037202a1e6d06353b61263d050a0538493b3018544e14171d2b1c4218
# 3769373b66142f31297f291126410e042b01162d59103a0c005221075013
# 37242c202e1e3f743c36371130410c1e2b491a31574406014505291a550e
# 7f6922742e1a213270372e01264105193004532b1f554e120c1e2a145618
# 7d69143c23156d18392b35183141310e3b49213613590003453a291a555d
# 36273731341e297424372454230e0c0f2c49127f005f020245112718545d
# 26396320295b2531227161273c04430f360d533118444e0f0b1d31554615
# 323d6335660c24373b3a2554350f0a063e05533712101905165e66145f19
# 733e222766152220703e27063508074b300f53371e5d40444735291a555d
# 37283a7432146d2d3f2a6d541808171f330c530d12544e360c162f1b565d

这是一个典型的 M T P ( M a n y − T i m e − P a d ) MTP(Many-Time-Pad ) MTP(ManyTimePad)问题。构造一个一定长度的密钥 k e y key key,让明文异或 k e y key key.解密是只需要让密文异或上 k e y key key就可以得到明文。这样在信息传输过程中就只需要传输一次密钥就可以,这样的加密方式就是 M a n y − T i m e − P a d ( M T P ) Many-Time-Pad (MTP) ManyTimePad(MTP).

在这个加密过程中,值得一提的是小写字母 x o r xor xor空格得到对应的大写字母,大写字母 x o r xor xor空格得到对应的小写字母,字母 x o r xor xor字母 ! = != != 字母.

参考:Many-Time-Pad

exp:

import Crypto.Util.strxor as xo
import libnum, codecs, numpy as np
from Crypto.Util.number import long_to_bytes


def isChr(x):
    if ord('a') <= x and x <= ord('z'): return True
    if ord('A') <= x and x <= ord('Z'): return True
    return False


def infer(index, pos):
    if msg[index, pos] != 0:
        return
    msg[index, pos] = ord(' ')
    for x in range(len(c)):
        if x != index:
            msg[x][pos] = xo.strxor(c[x], c[index])[pos] ^ ord(' ')

def know(index, pos, ch):
    msg[index, pos] = ord(ch)
    for x in range(len(c)):
        if x != index:
            msg[x][pos] = xo.strxor(c[x], c[index])[pos] ^ ord(ch)


dat = []

def getSpace():
    for index, x in enumerate(c):
        res = [xo.strxor(x, y) for y in c if x!=y]
        f = lambda pos: len(list(filter(isChr, [s[pos] for s in res])))
        cnt = [f(pos) for pos in range(len(x))]
        for pos in range(len(x)):
            dat.append((f(pos), index, pos))

c1 = [
0x1f2037202a1e6d06353b61263d050a0538493b3018544e14171d2b1c4218,
0x3769373b66142f31297f291126410e042b01162d59103a0c005221075013,
0x37242c202e1e3f743c36371130410c1e2b491a31574406014505291a550e,
0x7f6922742e1a213270372e01264105193004532b1f554e120c1e2a145618,
0x7d69143c23156d18392b35183141310e3b49213613590003453a291a555d,
0x36273731341e297424372454230e0c0f2c49127f005f020245112718545d,
0x26396320295b2531227161273c04430f360d533118444e0f0b1d31554615,
0x323d6335660c24373b3a2554350f0a063e05533712101905165e66145f19,
0x733e222766152220703e27063508074b300f53371e5d40444735291a555d,
0x37283a7432146d2d3f2a6d541808171f330c530d12544e360c162f1b565d
]
c = []
for i in c1:
    c.append(long_to_bytes(i))

# c = [codecs.decode(x.strip().encode(), 'hex') for x in open('Problem.txt', 'r').readlines()]
msg = np.zeros([len(c), len(c[0])], dtype=int)

getSpace()

dat = sorted(dat)[::-1]
for w, index, pos in dat:
    infer(index, pos)

know(0,24,'r')
know(1,10,'h')
know(1,12,'r')
know(2,28,'d')
know(3,16,'o')

print('\n'.join([''.join([chr(c) for c in x]) for x in msg]))

key = xo.strxor(c[0], ''.join([chr(c) for c in msg[0]]).encode())
print(key)
# SICTF{MTP_AtTack_is_w0nderFu1}
know(0,24,'r')
know(1,10,'h')
know(1,12,'r')
know(2,28,'d')
know(3,16,'o')

这里解释一下这一段代码,因为直接跑脚本恢复的明文中有一些单词并没有恢复完整,所以需要配合 k n o w ( ) know() know()将一些字母替换成正确的字母。要特别注意下标,很容易弄错。

另外,在做这一题之前,我做过一题类似的(当时不知道是 M T P MTP MTP),是用 l i n g f e n g lingfeng lingfeng师傅的脚本做出来的。本次赛中尝试过那个脚本,无果。后来知道是这次数据太少,随机性太差。对本题稍加改动,

flag = open('flag.txt','rb').read()
assert flag.startswith(b'SICTF{') and flag.endswith(b'}')
article = open('article.txt','rb').read()

import random

strxor = lambda x,y: bytes([a^b for a,b in zip(x,y)])

result = []

for i in range(100):
    range_start = random.randint(0, len(article) - len(flag))
    mask = article[range_start:range_start + len(flag)]
    result.append(strxor(flag, mask))

with open("result.log","w") as fs:
    fs.writelines([str(i)+"\n" for i in result])

r e s u l t . l o o g result.loog result.loog文件:

b"=-c5f\x10(1>1$\x07'A\x0c\r\x7f\x08\x03/\x05U\r\r\x04\x06/\x1a_]"
b'6**52\x1em<5>3\x1d:\x06OK0\x07\x1f&WD\x06\x01E\x10*\x1c_\x19'
b's>&t.\x1a;1p*/\x00=\rC\x1c:I\x1f0\x04UN\r\x11^f\x1aW]'
b'</c24\x1e(t=:/T#\t\x0cK7\x08\x05:WQN\x07\r\x1d/\x16TQ'
b">,c'2\t( 37$\x07t\x03\x06\r0\x1b\x16\x7f\x02CN\r\x0bR2\x1dT]"
b'7(:\'f\x089&5+"\x1ct\x0e\x16\x1f\x7f\x00\x1d\x7f\x16^N\x01\x0b\x16*\x10B\x0e'
b";,c0'\x02>t#+3\x11 \x02\x0bK0\x1c\x07\x7f\x1e^N\x05\x0bR#\x1bU\x11"
b"6-c52[9<5\x7f-\x15'\x15C\x066\x07\x06+\x12\x10\x0c\x1dE\x01)\x18T]"
b's(-0f\x16":$72T5\x0f\x07K&\x0c\x12-\x04\x10\x1a\x0bE\x11)\x18TS'
b"6i6'f\x12#t$7$T7\x0e\r\x18+\x08\x1d+W@\x0f\n\n\x00'\x18P]"
b'=i":"[:=$7a\x18=\x15\x17\x07:I\x12/\x07B\x0b\x07\x0c\x132\x1c^\x13'
b's!"0f\x14#8)\x7f T8\x08\x0e\x02+\x0c\x17\x7f\x16^\nD\x16\x02#\x16X\x1b'
b'5i\xa1\xd4\xda>, |\x7f%\x06=\x0f\x08G\x7f\x08\x1d;WR\x0bD\x08\x174\x07H\x9f'
b"2''t.\x1e,&91&T=\x0fC\n;\x1c\x1f+W\\\x07\x02\x00\\f7D\t"
b"s(/#'\x02>t':a\x031\x13\x06K6\x07\x07:\x05U\x1d\x10\x00\x16f\x1c_]"
b"s&%t0\x1a!!5,a\x1d'A\x00\x03>\x07\x14:\x13\x1eN,\x00R$\x10R\x12"
b'$&68"[/1p>a\x168\x04\x10\x186\x07\x14\x7f\x1eVN\x01\x04\x11.UY\x08'
b' ="zf("t\':a\x13;A\x02\t0\x1c\x07\x7f\x18E\x1cD\x15\x172\x01H]'
b's/&#f\x1f,-#\x7f \x00t\x12\x0c\x06:I\x076\x1aUN\x00\x10\x00/\x1bV]'
b' i,2f\x1a=$":"\x1d5\x15\n\x041I\x047\x1eS\x06D\x04\x00#U^\x1b'
b's-1=(\x10at11%T6\x04C\x06:\x1b\x01&\x95\xb0\xf3JE03\x01\x11\x10'
b' iq`f\x13"!",oT\x16\x14\x17K>\x05\x04>\x0eCN\x13\x00R1\x10C\x18'
b"' 51f\x14+t$7$T9\x04\x02\x056\x07\x14\x7f\x18VN\x08\x0c\x14#UP\x13"
b'\x07!&t"\x1a4\'p,5\x061\x15\x00\x03\x7f\x06\x06+WY\x00D\x04\x1cf\x10_\x19'
b'}i\x0b1f\x19(7?2$\x07t\x0c\x0c\x19:I\x12/\x07B\x0b\x07\x0c\x132\x1cG\x18'
b"6**52\x12;1p0'T'\x08\x04\x03+RS,\x1e\\\x0b\n\x06\x17f\x02^\x08"
b'<:&t1\x13"t8>7\x11t\r\x0c\x18+I\x006\x10X\x1aD\x04\x1c"UY\x18'
b'6:0xf\r$3?-a\x15:\x05C\n\x7f\x02\x16:\x19^\x0b\x17\x16R)\x13\x11\x1c'
b'; 0t#\x1a?8)\x7f \x10!\r\x17K3\x00\x15:Y\x10*\x05\x17\x19(\x10B\x0e'
b'5i%&#\x1em951a\x03<\x0eC\x03>\x1f\x16\x7f\x16\x10\r\x0c\n\x1b%\x10\x1d]'
b'$,514Wm 14$T8\x08\x05\x0e\x7f\x0f\x1c-WW\x1c\x05\x0b\x06#\x11\x1f]'
b'7," .U\x8f\xf4]U\x08\x1at\x12\x17\x04-\x00\x16,WD\x06\x01E\x16)\x1a\\\x18'
b'6-mt\x11\x1em?>06T \t\x02\x1f\x7f\x06\x1d:WT\x0f\x1dE\x05#U\\\x08'
b"!:&xf\x14+t6-$\x11t\x0c\x06\x05\x7f\x1e\x1b0WX\x0f\x12\x00R'UR\x15"
b"&'&xf\x198 p>-\x19;\x12\x17K>\x05\x04>\x0eCN\x0c\x0c\x01f\x06T\x13"
b'2i(1#\x15#1#,a\x1b2A\x02\x1b/\x1b\x16<\x1eQ\x1a\r\n\x1cf\x02Y\x14'
b'%,c8/\r(0|\x7f(\x1at\x15\x0b\x0e\x7f\x1a\x1b>\x13_\x19D\n\x14f\x11T\x1c'
b';(7t2\x13"\'5\x7f6\x1c;A\x0f\x02)\x0c_\x7f\x18BN\x0c\x04\x04#U]\x14'
b'293&#\x18$5$67\x11t\x0e\x05K+\x01\x16\x7f\x1aU\x0f\n\x0c\x1c!U^\x1b'
b'7&m\x96\xe6vG\x19?,5T;\x07C\x1e,ES7\x18G\x0b\x12\x00\x00jUE\x1c'
b"!ec '\x10(t<6'\x11t\x07\x0c\x19\x7f\x0e\x01>\x19D\x0b\x00KR\x11\x10\x11\x16"
b"':c$#\t 5>:/\x00t\x12\x13\x02-\x00\x07*\x16\\N\x12\x04\x1e3\x10BS"
b'<;c</\x08m81,5T<\x0e\x16\x19,GS\x16WC\x1e\x01\x04\x19jU^\x1b'
b'2\'$1"Um\x1c5\x7f#\x117\x0e\x0e\x0e,I\x1e0\x05UN\x05\x15\x024\x10R\x14'
b"s', #\x1fm 8>5T \t\x0c\x18:I\x047\x18\x10\x02\r\x13\x17jU^\x0f"
b"'!c8/\x0f985\x7f \x04$\x13\x06\x086\x08\x076\x18^@D,\x06f\x1cB]"
b'2=+t$\t$:7\x7f T9\x04\x0f\x070\x1eS,\x00U\x0b\x10\x0b\x175\x06\x11\t'
b"<$c9'\x10(t$7$T2\x14\x0f\x07:\x1a\x07\x7f\x02C\x0bD\n\x14f\x01Y\x18"
b' !"0)\x0cm;6\x7f%\x115\x15\x0bK=\x1b\x1a1\x10\x10\x0fD\x08\x17*\x19^\n'
b'6i,8"[> ?-8T;\x07C\x050\x1dS=\x12Y\x00\x03E\x154\x14E\x18'
b':=&0f\x1a#0p,1\x117\x08\x05\x02:\rS+\x1e]\x0bD\x11\x1df\x19X\x0b'
b' i4;3\x17)t=>*\x11t\t\n\x06\x7f\x04\x1c-\x12\x10\x0f\x14\x15\x00#\x16X\x1c'
b'6gc\x03#[><?*-\x10t\r\n\x1d:I\x16>\x14XN\x00\x04\x0bf\x02X\t'
b":'7-f\x14+t921\x11:\x05\n\x058I\x17:\x16D\x06J\xa7\xd2K\x7fx\x13"
b'7i"0)\x0b9t$7$T\x11\x11\n\x08*\x1b\x16>\x19\x10\x03\x0b\x11\x06)U^\x1b'
b'!:mt\x0f[>$5>*Xt\x0e\x05K<\x06\x06-\x04UBD\n\x14f\x13C\x18'
b' =,&/\x1e>t91a\x03<\x08\x00\x03\x7f\x1d\x1b:WX\x0b\x16\nR.\x14U]'
b'}i\x10!%\x13m5>\x7f \x00 \x08\x17\x1e;\x0cS(\x18E\x02\x00E\x17+\x05Y\x1c'
b'}\x8b\xe3YL2m<1)$T;\x07\x17\x0e1I\x077\x18E\t\x0c\x11R/\x01\x11\n'
b'?>"-5[:1p($\x061A\n\x05+\x0c\x01:\x04D\x0b\x00E\x1b(UU\x14'
b"6;75/\x159-p0'T=\x0c\x13\x0e1\r\x1a1\x10\x10\n\x01\x04\x06.[\xf3\xdd"
b'6:c=5[.<11&\x110OC#:I\x11:\x14_\x03\x01\x16R+\x1aC\x18'
b'<<0t)\x1dm<5>-\x00<A\x16\x05+\x00\x1f\x7f\x00UN\x05\x17\x17f\x1c]\x11'
b" & ='\x0f$;>,a\x07<\x0e\x16\x07;I\x04:WS\x1c\x0b\x12\x16f\x1c_\t"
b"s\x00c<'\r(t$7.\x013\t\x17K6\x1dS(\x18E\x02\x00E\x10#UP\x13"
b'\x7fi!!2[,8=02\x00t\x00\x0f\x1c>\x10\x00\x7f\x1fY\x1dD\x16\x17(\x06T]'
b's:+;4\x0fm5#\x7fs@t\t\x0c\x1e-\x1a]\x7f5E\x1aD\x04\x1e1\x14H\x0e'
b';,"&/\x15*xp0/\x18-A\x17\x03:I\x113\x1e^\nD\x17\x17\'\x19X\x07'
b's?"83\x1e>zp\x165T<\x00\x10K0\x0f\x07:\x19\x10\x0c\x01\x00\x1cf\x1b^\t'
b's=+1f\x13(&?\x7f)\x150A\x0c\x053\x10S>W\\\x07\t\x0c\x06#\x11\x11\x1c'
b';i,!2[$:p>/T1\x0f\x07\x07:\x1a\x00\x7f\x01Y\x1d\x10\x04\\f&^]'
b'2=c .\x1em81,5T9\x08\r\x1e+\x0cS=\x0e\x10\x1d\x0b\x08\x17f\x06E\x0f'
b"7i.;(\x0f%'p>/\x10t\x18\x06\n-\x1aS+\x18\x10\r\x0b\x08\x17hUe\x15"
b'=-c</\x08m81,5T0\x00\x1a\x18\x7f\x06\x01\x7f\x1fY\x1dD\t\x135\x01\x11\x15'
b'\'!&-f\x1f"z\x92\xffL~\x19\x0e\x10\x1f\x7f\x06\x15\x7f\x02CBD\r\x1d1\x10G\x18'
b'6?&&?\x0f%=>8a\x00<\x04\x1aK;\x06]\x9d\xd7=d)\n\x012U^\x1b'
b'6i"&#[9<?,$Xt\x0e\x05K<\x06\x06-\x04UBD\x12\x1a)UF\x12'
b's\x00c5+[,2">(\x10xA\x00\x03>\x1b\x12<\x03U\x1c\r\x1f\x175UE\x15'
b's="?#[!=6:a\x12;\x13C\x0c-\x08\x1d+\x12T@D2\x17f\x1e_\x12'
b"}i\n f\x13,'p0'\x001\x0fC\t:\x0c\x1d\x7f\x19_\x1a\x01\x01R2\x1dP\t"
b's!,!4\x08m5#\x7f,\x1b&\x15\x02\x07\x7f\x0b\x166\x19W\x1dHE\x05.\x14E]'
b'!&(1f\x14+t603\x00!\x0f\x06G\x7f\x0b\x06+WQ\x02\t\n\x012UP\x11'
b"=i4</\x18%t$7$T<\x04\x11\x04\x7f\x01\x12;W_\x00\x08\x1cR'U]\x14"
b"6i'5?[:1p24\x07 A\x07\x02:ES=\x02DN\x11\x16\x07'\x19]\x04"
b'7i.5-\x1em<92a\x19;\x13\x06K>\x19\x03-\x12S\x07\x05\x11\x1b0\x10\x11\x12'
b'#;&7/\x1a91p7$\x15&\x08\r\x0csI\x1c1\x1bIN\x10\r\x17f\x17]\x14'
b'? %1f\x1a#0p65\x07t\x11\x06\x192\x08\x1d:\x19DN\x17\x15\x1b4\x1cE\x08'
b'\x1ai+50\x1em;6+$\x1at\x15\x0b\x04*\x0e\x1b+WY\x1aD\x12\x1d3\x19U]'
b's>,!*\x1fm914$T<\x08\x0eK2\x06\x01:WQ\x1e\x14\x17\x17%\x1cP\t'
b"0;*9/\x15,8#\x7f6\x1c;\x12\x06K,\x19\x1b:\x05UN\x0b\x03R'\x16E\x14"
b'?0c5"\x0e! p3(\x121OC/>\x1b\x181\x12C\x1dD\x12\x1d3\x19U]'
b'>,1&?\x99\xcd\xc9~\x7f\x03\x01 A\x0e\x04,\x1dS/\x12_\x1e\x08\x00R1\x1aD\x11'
b"s:+;3\x17)t':a\x17&\x0e\x14\x0f\x7f\x00\x1d+\x18\x10\x1a\x0c\n\x01#U]\x1c"
b"200t'\x0fm'?2$T \x08\x0e\x0e\x7f\r\x06-\x1e^\tD\r\x1b5UT\x1c"
b's&%t5\x12*<$da\x07=\r\x06\x05<\x0cS(\x18E\x02\x00E\x06#\x14R\x15'
b'\x00< <f\x089;"6$\x07t\x12\x06\x1f\x7f\x1c\x00\x7f\x03X\x07\n\x0e\x1b(\x12\x1d]'
b"' .15[,'p,)\x1b&\x15C\n,IAkWX\x01\x11\x17\x01hUs\x08"
b"2*682\x12('~\x7f\x15\x1c1\x08\x11K:\x10\x16,WQ\x00\x00E\x17'\x07B]"
b'2$&t)\x17)t#+.\x06-A\x0c\r\x7f\x07\x1c+WR\x0b\r\x0b\x15f\x12C\x1c'
b"2;ot5\x14 1$6,\x11'A\x02\x18\x7f\x1a\x1b0\x05DN\x05\x16RtA\x11\x15"

exp:

from collections import Counter
from tqdm import *

with open("result.log","r") as f:
    f=f.readlines()
# print(f)

strxor = lambda x,y: bytes([a^b for a,b in zip(x,y)])

result=[eval(i)for i in f]    # 评估
# print(result)
c=[]
for i in result:
    c.append(strxor(b'SICTF{',i[:6]))

# 爆破
re=[]
for x in tqdm(c):
    for i in result:
        for j in range(0,len(i)-6):
            tmp=strxor(i[j:j+6],x)
            if len(str(tmp)) == 9:
                re.append(tmp.decode())
# print(re)

# flag拼接
flag='SICTF{'
for _ in trange(30-7):
    col=[]
    for i in re:
        # print(i[:5])
        if flag[-5:] == i[:5]:
            col.append(i[-1])
    K = Counter(col)
    # print(K)
    flag = flag + K.most_common()[0][0]
    # print(flag)
print(flag+'}')

Easy_CopperSmith

题目

from Crypto.Util.number import *
from flag import flag
p = getPrime(512)
q = getPrime(512)
n = p * q
e = 65537
leak = p >> 230
m = bytes_to_long(flag)
c = pow(m,e,n)
print(n)
print(leak)
print(c)
'''
114007680041157617250208809154392208683967639953423906669116998085115503737001019559692895227927818755160444076128820965038044269092587109196557720941716578025622244634385547194563001079609897387390680250570961313174656874665690193604984942452581886657386063927035039087208310041149977622001887997061312418381
6833525680083767201563383553257365403889275861180069149272377788671845720921410137177
87627846271126693177889082381507430884663777705438987267317070845965070209704910716182088690758208915234427170455157948022843849997441546596567189456637997191173043345521331111329110083529853409188141263211030032553825858341099759209550785745319223409181813931086979471131074015406202979668575990074985441810
'''

很明显是 P P P高位攻击。但注意的是,当满足以下条件时才能 c o p p e r copper copper,
k = p 未 知 比 特 位 p 总 比 特 位 ≤ 0.44 k=\frac{p未知比特位}{p总比特位}\leq0.44 k=pp0.44
当不满足这个条件且 k k k与0.44很接近时, f . s m a l l r o o t s ( X , b e t a , e p s i l o n ) f.small_roots(X,beta,epsilon) f.smallroots(X,beta,epsilon)中的 e p s i l o n epsilon epsilon参数改为0.01,即最小的时候,最有可能恢复 p p p

在本题中,
k = 230 512 = 0.4492 k=\frac{230}{512}=0.4492 k=512230=0.4492
所以需要设置 e p s i l o n epsilon epsilon参数.

exp:

#sage
from Crypto.Util.number import *
import gmpy2
n = 114007680041157617250208809154392208683967639953423906669116998085115503737001019559692895227927818755160444076128820965038044269092587109196557720941716578025622244634385547194563001079609897387390680250570961313174656874665690193604984942452581886657386063927035039087208310041149977622001887997061312418381
hint = 6833525680083767201563383553257365403889275861180069149272377788671845720921410137177
c = 87627846271126693177889082381507430884663777705438987267317070845965070209704910716182088690758208915234427170455157948022843849997441546596567189456637997191173043345521331111329110083529853409188141263211030032553825858341099759209550785745319223409181813931086979471131074015406202979668575990074985441810
e = 65537

p_high = (hint<<230)
# print(p_high)
PR.<x> = PolynomialRing(Zmod(n))
f = p_high + x
x = f.small_roots(X=2^230, beta=0.4,epsilon=0.01)[0]
p = p_high+int(x)
q = n//p
print(f"p = {p}")
print(f"q = {q}")
d = gmpy2.invert(e,(p-1)*(q-1))
m = gmpy2.powmod(c,d,n)
print(long_to_bytes(m))

签到题来咯!

题目

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

m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
e = getPrime(10)
n = p*q
c1 = pow(114*m+2333,e,n)
c2 = pow(514*m+4555,e,n)
print(f'n = {n}')
print(f'c1 = {c1}')
print(f'c2 = {c2}')
'''
n = 18993579800590288733556762316465854395650778003397512624355925069287661487515652428099677335464809283955351330659278915073219733930542167360381688856732762552737791137784222098296804826261681852699742456526979985201331982720936091963830799430264680941164508709453794113576607749669278887105809727027129736803614327631979056934906547015919204770702496676692691248702461766117271815398943842909579917102217310779431999448597899109808086655029624478062317317442297276087073653945439820988375066353157221370129064423613949039895822016206336117081475698987326594199181180346821431242733826487765566154350269651592993856883
c1 = 3089900890429368903963127778258893993015616003863275300568951378177309984878857933740319974151823410060583527905656182419531008417050246901514691111335764182779077027419410717272164998075313101695833565450587029584857433998627248705518025411896438130004108810308599666206694770859843696952378804678690327442746359836105117371144846629293505396610982407985241783168161504309420302314102538231774470927864959064261347913286659384383565379900391857812482728653358741387072374314243068833590379370244368317200796927931678203916569721211768082289529948017340699194622234734381555103898784827642197721866114583358940604520
c2 = 6062491672599671503583327431533992487890060173533816222838721749216161789662841049274959778509684968479022417053571624473283543736981267659104310293237792925201009775193492423025040929132360886500863823523629213703533794348606076463773478200331006341206053010168741302440409050344170767489936681627020501853981450212305108039373119567034948781143698613084550376070802084805644270376620484786155554275798939105737707005991882264123315436368611647275530607811665999620394422672764116158492214128572456571553281799359243174598812137554860109807481900330449364878168308833006964726761878461761560543284533578701661413931
'''

感官上能看出 m 1 和 m 2 m1和m2 m1m2存在某种线性关系。所以是相关信息攻击( F r a n k l i n − R e i t e r Franklin-Reiter FranklinReiter)

简单来说,相关信息攻击就是如果两个信息之间存在某种线性关系,并且在相同的 n n n e e e下进行 R S A RSA RSA加密,那么就有可能恢复出这两个消息.

如果两条消息之间仅存在某种线性关系

并且在相同的(N,e)下进行RSA加密

那么就有可能同时恢复它们

m1 = bytes_to_long(flag)

m2 = a * m1 + b,其中b!=0

c1 = pow(m1,e,n)

c2 = pow(m2,e,n)

其中a,b,c1,c2,e,n都已知,那么m1,m2可被破解

参考:Franklin-Reiter相关消息攻击

exp:

from Crypto.Util.number import *
import binascii
n = 18993579800590288733556762316465854395650778003397512624355925069287661487515652428099677335464809283955351330659278915073219733930542167360381688856732762552737791137784222098296804826261681852699742456526979985201331982720936091963830799430264680941164508709453794113576607749669278887105809727027129736803614327631979056934906547015919204770702496676692691248702461766117271815398943842909579917102217310779431999448597899109808086655029624478062317317442297276087073653945439820988375066353157221370129064423613949039895822016206336117081475698987326594199181180346821431242733826487765566154350269651592993856883
c1 = 3089900890429368903963127778258893993015616003863275300568951378177309984878857933740319974151823410060583527905656182419531008417050246901514691111335764182779077027419410717272164998075313101695833565450587029584857433998627248705518025411896438130004108810308599666206694770859843696952378804678690327442746359836105117371144846629293505396610982407985241783168161504309420302314102538231774470927864959064261347913286659384383565379900391857812482728653358741387072374314243068833590379370244368317200796927931678203916569721211768082289529948017340699194622234734381555103898784827642197721866114583358940604520
c2 = 6062491672599671503583327431533992487890060173533816222838721749216161789662841049274959778509684968479022417053571624473283543736981267659104310293237792925201009775193492423025040929132360886500863823523629213703533794348606076463773478200331006341206053010168741302440409050344170767489936681627020501853981450212305108039373119567034948781143698613084550376070802084805644270376620484786155554275798939105737707005991882264123315436368611647275530607811665999620394422672764116158492214128572456571553281799359243174598812137554860109807481900330449364878168308833006964726761878461761560543284533578701661413931


def franklinReiter(n,e,c1,c2):
    PR.<x> = PolynomialRing(Zmod(n))
    g1 = (114*x+2333)^e - c1
    g2 = (514*x+4555)^e - c2

    def gcd(g1, g2):
        while g2:
            g1, g2 = g2, g1 % g2
        return g1.monic()
    return -gcd(g1, g2)[0]

def get_all_10_bit_primes():
    return [i for i in range(2**9, 2**10) if isPrime(i)]

e_all = get_all_10_bit_primes()
print(e_all)
for e in e_all:
    m=franklinReiter(n,e,c1,c2)
    flag = long_to_bytes(int(m))
    if b'SICTF' in flag:
        print(flag)
        break

print("over")
# SICTF{hhh!!franklin_reiter_is_easy}

small_e

题目

import libnum
from Crypto.Util.number import *
import uuid
flag="SICTF{"+str(uuid.uuid4())+"}"
m=libnum.s2n(flag)
p=getPrime(1024)
q=getPrime(1024)
n=p*q
e=3
c=pow(m,e,n)
m1=((m>>60)<<60)
print("n=",n)
print("e=",e)
print("c=",c)
print("((m>>60)<<60)=",m1)
print(flag)
'''
n= 23407088262641313744603678186127228163189328033499381357614318160776774708961658114505773173784501557046914457908828086210961235530240151825359345210845219656000760996670856300710703016947799649686427460688236465568188205550456293373157997725204643414082796492333552579250010906010553831060540937802882205118399938918764313169385349293602085310111289583058965780887097301702677087443291977479125263301000328313103296364864396361278863921717374909215078711198899810620522933994481419395021233240234478331179727351050575360886334237633420906629984625441302945112631166021776379103081857393866576659121443879590011160797
e= 3
c= 1584727211980974717747362694412040878682966138197627512650829607105625096823456063149392973232737929737200028676411430124019573130595696272668927725536797627059576270068695792221537212669276826952363636924278717182163166234322320044764324434683614360641636360301452618063418349310497430566465329766916213742181
((m>>60)<<60)= 11658736990073967239197168945911788935424691658202162501032766529463315401599017877851823976178979438592
'''

e = 3 e=3 e=3很明显是低加密指数攻击,直接上脚本

import gmpy2
import libnum
n= 23407088262641313744603678186127228163189328033499381357614318160776774708961658114505773173784501557046914457908828086210961235530240151825359345210845219656000760996670856300710703016947799649686427460688236465568188205550456293373157997725204643414082796492333552579250010906010553831060540937802882205118399938918764313169385349293602085310111289583058965780887097301702677087443291977479125263301000328313103296364864396361278863921717374909215078711198899810620522933994481419395021233240234478331179727351050575360886334237633420906629984625441302945112631166021776379103081857393866576659121443879590011160797
e= 3
c= 1584727211980974717747362694412040878682966138197627512650829607105625096823456063149392973232737929737200028676411430124019573130595696272668927725536797627059576270068695792221537212669276826952363636924278717182163166234322320044764324434683614360641636360301452618063418349310497430566465329766916213742181
k = 0
while 1:
    s = gmpy2.iroot(c+k*n, e)
    if s[1]:
        print(libnum.n2s(int(s[0])))
        break
    k += 1
# SICTF{2ca8e589-4a31-4909-80f0-9ecfc8f8cb37}

easy_math

题目

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

m = bytes_to_long(flag)
p = getPrime(512)
q = getPrime(512)
n = p * q
e = 65537
hint1 = getPrime(13)*p+getPrime(256)*q
hint2 = getPrime(13)*p+getPrime(256)*q
c = pow(m,e,n)
print(f'n = {n}')
print(f'hint1 = {hint1}')
print(f'hint2 = {hint2}')
print(f'c = {c}')

'''
n = 68123067052840097285002963401518347625939222208495512245264898037784706226045178539672509359795737570458454279990340789711761542570505016930986418403583534761200927746744298082254959321108829717070206277856970403191060311901559017372393931121345743640657503994132925993800497309703877076541759570410784984067
hint1 = 564294243979930441832363430202216879765636227726919016842676871868826273613344463155168512928428069316237289920953421495330355385445649203238665802121198919543532254290185502622234014832349396422316629991217252686524462096711723580
hint2 = 484307144682854466149980416084532076579378210225500554261260145338511061452958092407101769145891750844383042274498826787696953308289632616886162073232218214504005935332891893378072083589751354946391146889055039887781077066257013110
c = 57751903193610662622957432730720223801836323458721550133101805763463060486486266309568004721657732742899781400754207249733137375171400440423755473421971160000575072519031824740691618617905549725344323721903857290320737224300672847773455169809689188843070599176261204013341324705808617411345132933937680951713
'''

思路:看了题目后,第一反应就是爆破。因为 a 1 , a 2 a_{1},a_{2} a1,a2都是 13 b i t 13bit 13bit(很小), b 1 , b 2 b_{1},b_{2} b1,b2都是 256 b i t 256bit 256bit(很大),所以这里选择消去 p p p,爆 a 1 , a 2 a_{1},a_{2} a1,a2.
{ h i n t 1 = a 1 ∗ p + b 1 ∗ q h i n t 2 = a 2 ∗ p + b 2 ∗ q \left\{\begin{matrix} hint1 = a_{1}*p+b_{1}*q\\ hint2 = a_{2}*p+b_{2}*q \end{matrix}\right. {hint1=a1p+b1qhint2=a2p+b2q

⇒ a 2 ∗ h i n t 2 − a 1 ∗ h i n t 2 = ( a 2 ∗ b 1 − a 1 ∗ b 2 ) ∗ q = k ∗ q \Rightarrow a_{2}*hint2-a_{1}*hint2 = (a_{2}*b_{1}-a_{1}*b_{2})*q = k*q a2hint2a1hint2=(a2b1a1b2)q=kq

参考:apbq-rsa-i

exp:

import itertools
from Crypto.Util.number import *
from tqdm import tqdm
from math import gcd

# n, c, hints
n = 68123067052840097285002963401518347625939222208495512245264898037784706226045178539672509359795737570458454279990340789711761542570505016930986418403583534761200927746744298082254959321108829717070206277856970403191060311901559017372393931121345743640657503994132925993800497309703877076541759570410784984067
hint1 = 564294243979930441832363430202216879765636227726919016842676871868826273613344463155168512928428069316237289920953421495330355385445649203238665802121198919543532254290185502622234014832349396422316629991217252686524462096711723580
hint2 = 484307144682854466149980416084532076579378210225500554261260145338511061452958092407101769145891750844383042274498826787696953308289632616886162073232218214504005935332891893378072083589751354946391146889055039887781077066257013110
c = 57751903193610662622957432730720223801836323458721550133101805763463060486486266309568004721657732742899781400754207249733137375171400440423755473421971160000575072519031824740691618617905549725344323721903857290320737224300672847773455169809689188843070599176261204013341324705808617411345132933937680951713

hints = [hint1,hint2]
A = []
for i in range(2**12,2**13):  # 找出13bit的所有素数
    if isPrime(i):
        A.append(i)

# 爆破
for a1, a2 in tqdm(list(itertools.product(A, repeat=2))):
    kq = gcd(a1 * hints[0] - a2 * hints[1], n)
    if 1 < kq < n:
        print('find!', kq, a1, a2)
        break
for i in range(2,100):   # 去除因子,求出q
    if kq % i == 0:
        kq //= i
q = kq
p = n // kq
d = pow(0x10001, -1, (p - 1) * (q - 1))
m = pow(c, d, n)
flag = long_to_bytes(m).decode()
print(flag)
# SICTF{452aebb6-9c16-441a-ac42-fc608bf6063f}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值