HSCCTF-2024-Crypto 复现


复现参考来源: lazzzaro佬写的题解

EZ_MATH

题目描述:

from Crypto.Util.number import *

flag = 'HSCCTF{*****************************************}'
x = bytes_to_long(flag.encode())
y = getPrime(200)
z = getPrime(200)
assert (x**2+1)*(y**2+1)*(z**2+1) + 4 * ((x*y*z)*(x+y+z)+(x*y+x*z+y*z)) == jl + 2*(x+y+z+x*y*z)*(x*y+y*z+x*z+1)

w = 1007766898498955907869786015006414110177963571599690507305616866798367726133772947904112344473803352290475298324967917118497719002314168582330651485077694557008496465717884047202330407870172675541471666596768873677342429660840647109788577728613362048023960188394853332768656214046219781162891725391990618222498709603165658933818803574737
a = jl + 2024
b = jl + 2025
c = getPrime(1000)
assert w*(a*c + b*c - a*b) == 4*a*b*c

题目分析:
w ( a c + b c − a b ) = 4 a b c ⇒ 4 w = 1 a + 1 b − 1 c w(ac + bc - ab) = 4abc \Rightarrow \frac{4}{w} = \frac{1}{a} + \frac{1}{b} - \frac{1}{c} w(ac+bcab)=4abcw4=a1+b1c1
丢番图方程,第一次了解这个,根据论文 以及结合题目知道 a = w − 1 2 , b = w + 1 2 ,得到 j l = a − 2024 a = \frac{w-1}{2},b = \frac{w+1}{2},得到jl = a - 2024 a=2w1b=2w+1,得到jl=a2024
在这里插入图片描述

j l = ( x 2 + 1 ) ( y 2 + 1 ) ( z 2 + 1 ) + 4 [ ( x y z ) ( x + y + z ) + ( x y + x z + y z ) ] − 2 ( x + y + z + x y z ) ( x y + y z + x z + 1 ) = ( x − 1 ) 2 ( y − 1 ) 2 ( z − 1 ) 2 jl = (x^2+1)(y^2+1)(z^2+1)+4[(xyz)(x+y+z)+(xy+xz+yz)]-2(x+y+z+xyz)(xy+yz+xz+1)=(x-1)^2(y-1)^2(z-1)^2 jl=(x2+1)(y2+1)(z2+1)+4[(xyz)(x+y+z)+(xy+xz+yz)]2(x+y+z+xyz)(xy+yz+xz+1)=(x1)2(y1)2(z1)2
让我想到了之前做过的一题

在这里插入图片描述

一样的解法

from gmpy2 import *
from Crypto.Util.number import *
w = 1007766898498955907869786015006414110177963571599690507305616866798367726133772947904112344473803352290475298324967917118497719002314168582330651485077694557008496465717884047202330407870172675541471666596768873677342429660840647109788577728613362048023960188394853332768656214046219781162891725391990618222498709603165658933818803574737
a = (w - 1) // 2
jl = a - 2024
tmp = iroot(jl,2)[0]
t = divisors(tmp)
tt = []
for i in t:
    if (i + 1).nbits() == 200 and isPrime(int(i + 1)):
        tt.append(i)

for i in tt:
    for j in tt:
        if i != j and tmp % (i * j) == 0:
            m = long_to_bytes(int(tmp // i // j + 1))
            if b'HSCCTF' in m:
                print(m)
                
# HSCCTF{math_is_good}

STAR_CHASING_DIARY

题目描述:
在这里插入图片描述

task.py:

"""
小肖在学习的过程中,了解到了一种填充图片的算法,兴奋的她用它和RSA加密了偶像的照片,
但是在传输的过程中丢失了一部分加密算法,你能帮她补全,并解出来偶像的照片吗?
"""
from PIL import Image


def f(n, x, y):
    if n == 0:
        return 1
    m = 1 << (n - 1)


j = 128
mm = []
for i in range(1, 257):
    for s in range(1, 257):
        mm.append(f(j, i, s) - 1)

img = Image.open('flag.jpg')
pixels = list(img.getdata())
data = [pixel for pixel in pixels]

img = Image.open('key.png')
pixels = list(img.getdata())
png_key = [pixel for pixel in pixels]

enc = [0] * 65536
for i in range(65536):
    enc[i] = data[mm[i]]
for s in range(65536):
    enc[s] = enc[s] ^ png_key[s]

image = Image.new('L', (256, 256))
image.putdata(enc)
image.save('enc.jpg')

key.py:

from Crypto.Util.number import *
from random import *

p = getPrime(512)
q = getPrime(512)
print("p =", p)
print("q =", q)
n = p * q
key = '********************'
m = bytes_to_long(key.encode())
assert m.bit_length() < 300
r = randint(1, n)
c = (pow(n + 1, m, n * n) * pow(r, n, n * n)) % (n * n)
print("c =", c)

# p = 7828612943367317778189697443061863547768704021648982642807960201410438190347546379219450386530108335470584219657007036386835647156694512102467911388214639
# q = 11560196429251786803557082533869761370530605728500211999842201987445533038949033226473164866960007192683170489064961432891988337343103657552186800680461299
# c = 768905250861905487717845092484035532140840941871031779930259407348955511757335716790249355464829607714399266689960353955065504221985891074636544161678177920296971444880997864168042745264256952808480926755620637239135808617643874771066244234690401223758004286234917537720362007827248701308605961814972773704288547887039586934111562590676930853945316673164146667949991176600280451163710564978897622310650541491271961315592017251211248379608602287809736613530069187936569470129814949302440734244885473716072898519354127964155042421376782226235081303957997587618278341829891036314980185040102049478608445519994654780162

题目分析:
先把key解出来,将key作为密码得到key.jpg
c ≡ ( n + 1 ) m ∗ r n ( m o d n ) 2 c ≡ r n ( m o d n ) 又 g c d ( n , p h i ) = 1 故 r s a 解密得到 r c ≡ ( n ∗ m + 1 ) ∗ r n ( m o d n ) 2 m = ( c ∗ i n v r n − 1 ) / / n c \equiv (n + 1) ^ m * r ^ n \pmod n^2\\ c \equiv r^n \pmod n\\ 又gcd(n,phi) = 1\\ 故rsa解密得到r\\ c \equiv (n * m + 1) * r^n \pmod n^2\\ m = (c * inv_{r^n} - 1) // n c(n+1)mrn(modn)2crn(modn)gcd(n,phi)=1rsa解密得到rc(nm+1)rn(modn)2m=(cinvrn1)//n
m = key,求出key

from Crypto.Util.number import *
p = 7828612943367317778189697443061863547768704021648982642807960201410438190347546379219450386530108335470584219657007036386835647156694512102467911388214639
q = 11560196429251786803557082533869761370530605728500211999842201987445533038949033226473164866960007192683170489064961432891988337343103657552186800680461299
c = 768905250861905487717845092484035532140840941871031779930259407348955511757335716790249355464829607714399266689960353955065504221985891074636544161678177920296971444880997864168042745264256952808480926755620637239135808617643874771066244234690401223758004286234917537720362007827248701308605961814972773704288547887039586934111562590676930853945316673164146667949991176600280451163710564978897622310650541491271961315592017251211248379608602287809736613530069187936569470129814949302440734244885473716072898519354127964155042421376782226235081303957997587618278341829891036314980185040102049478608445519994654780162
n = p * q
phi = (p - 1) * (q - 1)
d = inverse(n,phi)
r = pow(c,d,n)
m = (c * inverse(pow(r,n,n**2),n**2) % n ** 2 - 1) // n
print(long_to_bytes(m))
# HSCCTF{this_is_a_fake_flag}

继续往后走可以知道函数f()缺失了部分内容
如果能把它补全后面其实就很容易了
不过…好像不太会
参考题解 知道了这里使用的是Hilber曲线
这个东西不太了解,贴一下他f()的补全代码

from PIL import Image

def f(n, x, y):
    if n == 0:
        return 1
    m = 1 << (n - 1)
    if x <= m:
        if y <= m:
            return f(n - 1, y, x)
        else:
            return m * m + f(n - 1, x, y - m)
    else:
        if y > m:
            return 2 * m * m + f(n - 1, x - m, y - m)
        else:
            return 3 * m * m + f(n - 1, m + 1 - y, m + 1 - (x - m))

j = 128
mm = []
for i in range(1, 257):
    for s in range(1, 257):
        mm.append(f(j, i, s) - 1)
print(mm)

img = Image.open('enc.jpg')
pixels = list(img.getdata()) # 获取图像的像素数据,其中包含图像的每个像素值。
enc = [pixel for pixel in pixels]

img = Image.open('key.png')
pixels = list(img.getdata())
png_key = [pixel for pixel in pixels]

flag = [0] * 65536

for s in range(65536):
    enc[s] = enc[s] ^ png_key[s]

for i in range(65536):
    flag[mm[i]] = enc[i]
image = Image.new('L', (256, 256))
image.putdata(flag)
image.save('flag.jpg')

在这里插入图片描述

RSATEST

题目描述:
给了两个文件,公钥和密文
在这里插入图片描述
output.txt:

��]�Õ���S�r�,r/0�K�l+�G3 �@R[�Y	H@�)��2������A��_%������3��B��z{��D�~���<0�>%w�O���{߿�m�?�t	��Pb�B\���p�"�C�N�R-Җ

public.pem:

-----BEGIN PUBLIC KEY-----
MIIBHjANBgkqhkiG9w0BAQEFAAOCAQsAMIIBBgKBgHTLuyND25kD8MCPUuQCpfDr
6MawCi9N6L9Ul3bNunsbqZCmbW+4qyTM6moEg1DhPG7yWr6SRoWzISWGqIJXdT1n
ffrzN5WDpJz0SXLPBxXg4Qa67EWkfhX7QoHqVwukp6TnsE52+C6KVAklE8XFpL1M
oUgLZPUVuW3P8kFm2ZnZAoGAKLbHn2ZjaJn0f7ntpfHdX3kV2KN16dY1tJL92Ofi
2fbFBQiSJOjB5tCyGlTgwQr5lgjATXBaWDE1EQZjLeZ2XjtwlqcydJuTIID2FcuJ
LD2+SRoa6RG1YQZuRDQyIawpj4IvVYeSXUVWIFcnvXuk16Mo9TH0l/b106geNTyO
fDU=
-----END PUBLIC KEY-----

题目分析:
读取出来就行,丢网站也行

import libnum
from Crypto.PublicKey import RSA
with open("public.pem","rb") as f:
    key = RSA.import_key(f.read())
    n = key.n
    e = key.e
with open("output (3).txt","rb") as f:
    c=f.read()
    c=libnum.s2n(c)

得到:

c = 20445676203540626395755053467133529959715600562035927844523659068411396628571794822400646107357450885817807291720524678120761937853476136366332267212774471948111086950988580849665756177631323022773629882086668015313408688752387095131856020203902550776996136923318560836161781553442777881508753488594007347862
n = 82016816963574560365976489524199243050120748716806912567895093731022264392235286524041630435256965141365061465268083316572087612155218061280174438822024011254230300135794845491207820824129566975766207833561478897150955561714805950254000266078855648956964973181825856857736088834707915779351726709234357344729
e = 28590331496425613818981991777617535857151582651120346436859967760844419275658771430821058722393674433618893115968176611013590439492663850993790177381059077045197086133940118402088554088073121591402095323966107722485647643452801806511583327361664114727935171402256611877627071996643841223356362367747555753013

维纳攻击得到d,m应该就能出了
当时提交了几遍都不正确,怪

def continuedFra(x, y):
    cf = []
    while y:
        cf.append(x // y)
        x, y = y, x % y
    return cf

def gradualFra(cf):
    numerator = 0 # 分子
    denominator = 1 # 分母
    for x in cf[::-1]:
        # 这里的渐进分数分子分母要分开
        numerator, denominator = denominator, x * denominator + numerator
    return numerator, denominator

def solve_pq(a, b, c):
    par = gmpy2.isqrt(b * b - 4 * a * c)
    return (-b + par) // (2 * a), (-b - par) // (2 * a)

def getGradualFra(cf):
    gf = []
    for i in range(1, len(cf) + 1):
        gf.append(gradualFra(cf[:i]))
    return gf

def wienerAttack(e, n):
    cf = continuedFra(e, n)
    gf = getGradualFra(cf)
    for d, k in gf: # 不得不说最后要倒一下呀!
        if k == 0: continue
        if (e * d - 1) % k != 0:
            continue
        phi = (e * d - 1) // k
        p, q = solve_pq(1, n - phi + 1, n)
        if p * q == n:
            return d

d=wienerAttack(e, n)

YOUQU

题目描述:

from Crypto.Util.number import *
import numpy as np
from numpy.polynomial import polynomial as poly
from Crypto.Util.number import *
np.int64(np.round(1.1))

def mul(x, y, z, mod): # 多项式的乘法运算,(x * y % mod) % z
    init_poly = poly.polymul(x, y) # 接受两个多项式作为输入,并返回它们相乘的结果多项式
    res_poly = poly.polydiv(init_poly % z, mod)[1] % z # 多项式除法操作,返回余数部分
    return np.int64(np.round(res_poly)) # 四舍五入,并转换为64位整型

def add(x, y, z, mod): # (x + y) % mod % z
    init_poly = poly.polyadd(x, y) # 多项式相加
    res_poly = poly.polydiv(init_poly % z, mod)[1] % z # 多项式相除,取余数部分
    return np.int64(np.round(res_poly)) # 四舍五入,转整数

def q2(lenth1): # 包含 0 和 1 的随机整数数组 长度为128
    return np.random.randint(0, 2, lenth1, dtype=np.int64)

def qz(z, lenth1): # 包含 0 - z 的随机整数数组 长度为128
    return np.random.randint(0, z, lenth1, dtype=np.int64)

def guess(lenth1): # 每个元素都服从均值为 0,标准差为 2 的正态分布
    return np.int64(np.random.normal(0, 2, size=lenth1))

def jlkey(lenth1, z, mod):
    s = q2(lenth1) # 包含 0 和 1 的随机整数数组 长度为128
    g = qz(z, lenth1) # 包含 0 - 2 ** 62 的随机整数数组 长度为128
    e1 = guess(lenth1) # # 每个元素都服从均值为 0,标准差为 2 的正态分布
    t = add(mul(g, s, z, mod), e1, z, mod) # (((g * s) % mod) + e1) % mod % n
    key = [g, t, s]
    return key # g, (((g * s) % mod) + e1) % mod % n, s
#             128  2^62 2^32
def jl(key, length1, n, p, mod, msg):
    jlm = []
    mm = hex(msg)[2:]
    for i in range(0, len(mm)):
        jlm.append(ord(mm[i]))

    m = np.array(jlm + [0] * (length1 - len(jlm)), dtype=np.int64) % p
    d = n // p
    dm = d * m % n
    e2 = guess(length1)
    e3 = guess(length1)
    r = q2(length1)
    g = key[0]
    t = key[1]
    w = add(add(mul(t, r, n, mod), e2, n, mod), dm, n, mod)
    v = add(mul(g, r, n, mod), e3, n, mod)
    c = [w, v]
    return c

o = 128
n = 2 ** 62
p = 2 ** 32
mod = np.array([1] + [0] * (o - 1) + [1])
key = jlkey(o, n, mod)
flag = 'HSCCTF{fakeflag_xin_nian_kuai_le}'
m = bytes_to_long(flag.encode())
c = jl(key, o, n, p, mod, m)
print("w =", c[0].tolist())
print("v =", c[1].tolist())
print("g =", key[0].tolist())
print("t =", key[1].tolist())
print("s =", key[1].tolist())
'''
w = [4456121292753321984, 2695388220323384832, 1125798304404134912, 1389165333028469760, 3720515311443086336, 1806160162087117824, 1710165564223285248, 3854525633894178816, 4160032803226148864, 3223993978734964736, 188029029972998144, 2283288149728718848, 178098730553155584, 400166020473782272, 4426677526375129088, 1768526165797007360, 4596103848246980608, 3143341953117548544, 4113813229295153152, 1444787342796136448, 1749143783191330816, 601663717837410304, 1976180375223943168, 899486064067571712, 2467702122158211072, 1442313048691163136, 2977506408218411008, 1106991111199326208, 844904722420957184, 1013497211561496576, 4250614525386129408, 1677797764964532224, 4212901529405988864, 2561734724771299328, 1890807629146202112, 951039123411230720, 881428262835757056, 514344970914586624, 3072465238399721472, 1294633561516974080, 4471068621313253376, 2978038764905480192, 1256294011046658048, 2885789906784919552, 1808546586690191360, 3846883621647482880, 422980376119787520, 3401510714240147456, 3024926897503240192, 3504641379026477056, 2686993749796929536, 4084804987293286400, 1949654215988994048, 2949577339713200128, 2514172581835300864, 614361226066452480, 1560522408220647424, 1215782736092413952, 1705607337158410240, 3789095360729792512, 126768310879952896, 3564560282876477440, 4112635401656336384, 488963213586022400, 3263989278014881792, 1190526290525741056, 3726804923972673536, 2773020963465314304, 2008550394681090048, 2877753734522249216, 3318721688589254656, 2685195110085615616, 2120287225013829632, 2837075008393977856, 680647261446750208, 2672034759831756800, 586790221783564288, 4413791420559310848, 753748175057453056, 4156435215025135616, 1753634903657668608, 3868573500772638720, 1065381465124585472, 1951729611177713664, 833463289401663488, 3083559584672243712, 2453364017450852352, 3187954181254758400, 2701962603281113088, 1657135743981748224, 3393942972234113024, 3224375546132267008, 1637663670848045056, 2226464092285288448, 3426678970486587392, 3746864906767974400, 892187878069846016, 1566105953383768064, 1841796609436766208, 102854404605427712, 1384852880673484800, 2187150610629812224, 3960839367218393088, 798293770690805760, 172119736121323520, 2434320282093170688, 3398926147058458624, 858963714965422080, 3371154991043334144, 1537312801335345152, 2963315646558453760, 4058550201296797696, 1544831164568528896, 4296983781331357696, 3597399236973740032, 1172234645379473408, 1811007296491237376, 1364782914640955392, 1942828798540959744, 1312644494190576640, 540671172853423104, 2521681537802540032, 3678999552996606976, 3522586936321518592, 3355286245326997504, 1724989423167225856, 2857616461138001920, 3550411157752463360]
v = [3004075223514152960, 375766571298967040, 3918175633582001664, 298998053399571840, 4539733962165100544, 3415675319003214848, 557497174827461120, 1187181217327680512, 42761045408950272, 4539692406094923776, 3474777010512353280, 807990709249906688, 4401927180657766400, 628439373724332032, 3552565694197467136, 1229559664627433472, 2735485480783970304, 340251515454152704, 535029869298274304, 1089634905489248256, 1745435675342262272, 2211405319829864448, 3166387633265565696, 3356595592575791104, 811586262403354624, 1658544963444764672, 2801381922146680832, 1906405005677551616, 2764661089781948416, 348852661152833536, 2843732326950182912, 3655220640882900992, 2735228541582770176, 984245520265568256, 847631674608009216, 4278557074339209216, 354445030770749440, 552426514839019520, 3037890003690143744, 3845527152479436800, 686613871844605952, 1987014853275738112, 129221415412514816, 884028654840045568, 893161048767537152, 4428861422755028992, 1977654893495033856, 2683055322869915648, 4466344498597339136, 2820131774980661248, 2105607478169853952, 768444766180638720, 212987987936600064, 1576117523911901184, 1650389830627762176, 1915750840791851008, 4109009172913405952, 2218053892260061184, 3863963349465956352, 2990430210085863424, 1274030477779271680, 1711547929466978304, 1157679433574768640, 156097645996949504, 3695677787747401728, 4322888783310766080, 4546024412016992256, 2655974462028947456, 1604656974594400256, 2045021548923273216, 3161689730583207936, 8339332591755263, 2341948229963612160, 3607706207127453696, 469234496887414784, 973715854261501952, 789210633607102464, 4424949506055979008, 1542517731370860544, 182468406585786368, 1807090988320792576, 1850374377172516864, 2618527682038956032, 1262867559425187840, 938222240300924928, 4591256432328728576, 2044671823654682624, 3467964150293766144, 79543117595951104, 2185630104198291456, 3728244444110430208, 156056289984327680, 4390349499275018240, 1751182369256157184, 2162985531302232064, 2761554017168584704, 2829764058526203904, 2028689816016191488, 146286463995781120, 3720834471976288256, 2917463735459491840, 4566476477728677888, 3722002688823242752, 4245856959119122432, 3425954365963665408, 3618936531494342656, 3695636186696466432, 1423352273706041344, 158921080583421952, 4351926341975711744, 3376292832678187008, 3295795181429579776, 3267875754319810560, 2363850527793784832, 888488262224822272, 1097387081646508032, 3686827109357189120, 297511993689784320, 3698586652027076608, 1126524981060736000, 1227462499250052096, 195965752955788032, 378621325977167872, 4568860371418834944, 3806982850127191040, 2330191690590402560, 965690431040995328, 2254601344237207552]
g = [1271385667288255999, 3597939031086288160, 948720385886874982, 3730034896312885091, 155961058571645646, 873298702409407364, 3695415802847080551, 3935805697420664465, 303427777773526115, 2121504102169723388, 3117842710535023914, 2004730725267082784, 315298886702225235, 711790101004272712, 3469726824196756845, 3649946521480214795, 4269586158067475466, 1607685984041888423, 1866766258134518609, 4115571819844332380, 2381299916655519619, 2208948036365614734, 1946214530009282102, 330799912617809735, 3460498231343524429, 2694359423578749492, 793704330311549271, 1491532600134534859, 1606672420502700650, 561106526228105342, 1105025457886824442, 1443932433209975334, 4240908184445005305, 1954646486670721382, 4227369777555389059, 1563814260527576306, 771217858163031033, 1280424786084049063, 303853418224126180, 181918673882271714, 2212581027220765469, 2111888312694611250, 3581354821166105988, 1429049683930421764, 1357441041735699015, 3553280165847887597, 869489768651033960, 1107714765447012644, 2910143081602408601, 1433461290183315706, 3240132019514117541, 2465292834002904411, 1334470694725903257, 3156578894981065904, 35185442949043438, 645993467993501426, 1352915688916657829, 1521946784078789166, 2639858512187877401, 4315064694485922395, 3953315792354490874, 1587769214913102261, 3912000075342935904, 1887499577531299413, 309657057763429254, 769590223035802807, 4361036733963754384, 1446528785602732156, 1205711736426995533, 3683188791797133788, 921287773622604679, 3591274357626650529, 2745859155549230842, 4491978210538609848, 2444128709624329128, 1403888264551474491, 4377727165055311964, 1507498290240201527, 2952796830041690744, 1642562262970195060, 2847743992975447391, 4164239208310834247, 1967003682977431435, 2575799088251274004, 156708464748056204, 2403917842083313594, 55721043545237639, 239916744182811448, 134638877854791156, 76687455444928683, 3051612621194354938, 4253947515818696559, 392166402534779315, 5415521347314633, 1816697745794261287, 2282876916808180261, 3667412627019328976, 4211876289328416715, 1647128252024708114, 3721877072126461741, 2297068963395433648, 398583411660274597, 3562855580894975650, 1322989240042277117, 3551729861626536144, 2816759739903316271, 2629395545611893101, 1799561289667084873, 2629410111371391637, 1398369600901640698, 447266788926484707, 405213767544537836, 3014220918160576578, 747208265285548041, 1727187447678753569, 3063564852472463780, 1502638600503176791, 3284205888928186113, 3412854446691461073, 3937011809364193960, 1208514509487198642, 3063044796627572289, 2532417142719581087, 375928502591586817, 2839325684818922862, 4472409225244809142, 1384186637673587546, 1680318030162086049]
t = [3482937270284373504, 3729542463939501056, 1354530592839269376, 2340035975483411456, 3318144666530505728, 4321971466042776576, 4107840020098758656, 2600042509314867200, 3185315495632337920, 2510425761632839680, 3758844697217568768, 1813627045100445696, 1035634427310004224, 1650895865179787264, 931858574122051584, 3821738968282525696, 751354306590687232, 812159733109825536, 1984846083975063552, 426674528748978176, 1786129270688538624, 53204613942820864, 4207648582990901248, 2441413890227052544, 4573249524143439872, 2901255116891488256, 3331287389413953536, 1594453621617430528, 7636565623463936, 3261865719383670784, 3211543945355886592, 4414864510393499648, 1781787468450406400, 4381257290165919744, 1683943310183464960, 1618102318685454336, 3082727664554508288, 1284750602156802048, 4536273674447527936, 4224428964375134208, 1990811212107251712, 220641709431201792, 56727929599156224, 1394394833783595008, 474539825790402560, 2367070412709519360, 86013256530493440, 3983263247386468352, 4488230536002330624, 1131832099054157824, 4470326732790874112, 2361104703887433728, 1850267988673478656, 519014833878171648, 2447115942472581120, 2567048274520276992, 3409815404144214016, 2569012418791473152, 2239861171203006464, 3207035079062069248, 1423032481934245888, 3660676895628648448, 3197924030326439936, 2173721402472767488, 1836499846562930688, 1193190307175825408, 2757965850888388608, 3833547905923039232, 113362523505639424, 2095507640221974528, 695818728283136000, 2746136108677742592, 80271849461956608, 544596706215608320, 857894362373431296, 1801819582386577408, 2748888436946362368, 1760827740054806528, 2544591920627023872, 4324861829346312192, 3073160513540464640, 3260750497480876032, 1268136159796920320, 2738758060057362432, 460370852221685760, 3694812482865025024, 674485732026892288, 31827325234905088, 1076067066569760768, 3538749128687951872, 4553745898606747648, 3332219178735149056, 329835532944998400, 4576690061027602432, 3023286444576161792, 1797946474203955200, 4558389623053447168, 1790588264296259584, 3017170271014150144, 991463616551034880, 1940023178234544128, 3414390445152993280, 644333657859764224, 3692106158122917888, 3167684436092710912, 789204772426006528, 4353661356398166016, 2000540208800374784, 3942168043465134080, 3332450567729246208, 2627875622523490304, 9371534919516160, 848644069081235456, 2192689498702295040, 907016265148577792, 2645935549696630784, 2590866188404383744, 3750676748846913536, 3694849270404139008, 4268369840164233216, 3556945000413347840, 1995615102316576768, 4445424004994387968, 2929133498761163776, 2462149674675616768, 741748174115656704, 39754566828455680, 4477497218304360448]
jjgqJn00BoV2m68QERWUCmah8h86UJERRsVhfzEzy9hBwi0GJ5MyEzBCQS5r0yr7GrdM5d0ptnBWLzfywakvSlRJvex1efrtHiDVNo4WQZjopk4N3RFi4D
'''

题目分析:
最后那串密文先进行解密得到:

wo_shi_yhhhh_de_fen_si

在这里插入图片描述
解开得到图片,提取图片像素值得到s:

from PIL import Image
img = Image.open('s.png')
pixels = list(img.getdata())
s = [pixel for pixel in pixels]
print(s)
# [1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1]

RLWE相关参考1
RLWE相关参考2
目前知道的是:
t ≡ s ∗ g + e 1 ( m o d n ) w = t ∗ r + e 2 + d ∗ m ( m o d n ) v = g ∗ r + e 3 ( m o d n ) w − s v = d ∗ m + ( e 1 ∗ r + e 2 − s ∗ e 3 ) 又知道 e 1 , e 2 , e 3 , r , s 都是小向量 可知后面的 ( e 1 ∗ r + e 2 − s ∗ e 3 ) 仍然是小向量 所以有 ( e 1 ∗ r + e 2 − s ∗ e 3 ) / / d < 1 故 ( w − s ∗ v ) / / d = m 里面只有加法,此处自行转化一下即可 : w + s ∗ ( − v % n ) / / d = m ( e 1 ∗ r + e 2 − s ∗ e 3 ) 也有可能为负值,此时会出现 ( w − s ∗ v ) / / d = m − 1 ,所以这里得判断一下 t \equiv s * g + e1 \pmod n\\ w = t * r + e2 + d * m \pmod n\\ v = g * r + e3 \pmod n\\ w - sv = d * m + (e1 * r + e2 - s * e3)\\ 又知道e1,e2,e3,r,s都是小向量\\ 可知后面的(e1 * r + e2 - s * e3)仍然是小向量\\ 所以有(e1 * r + e2 - s * e3) // d < 1\\ 故(w - s * v) // d = m\\ 里面只有加法,此处自行转化一下即可:w + s * ( - v \% n) // d = m\\ (e1 * r + e2 - s * e3)也有可能为负值,此时会出现(w - s * v) // d = m - 1,所以这里得判断一下 tsg+e1(modn)w=tr+e2+dm(modn)v=gr+e3(modn)wsv=dm+(e1r+e2se3)又知道e1,e2,e3,r,s都是小向量可知后面的(e1r+e2se3)仍然是小向量所以有(e1r+e2se3)//d<1(wsv)//d=m里面只有加法,此处自行转化一下即可:w+s(v%n)//d=m(e1r+e2se3)也有可能为负值,此时会出现(wsv)//d=m1,所以这里得判断一下

import numpy as np
from numpy.polynomial import polynomial as poly
from Crypto.Util.number import *
np.int64(np.round(1.1))

def mul(x, y, z, mod): # 多项式的乘法运算,并对结果进行取模操作 (x * y % mod) % z
    init_poly = poly.polymul(x, y) # 接受两个多项式作为输入,并返回它们相乘的结果多项式
    res_poly = poly.polydiv(init_poly % z, mod)[1] % z # 多项式除法操作,返回余数部分
    return np.int64(np.round(res_poly)) # 四舍五入,并转换为64位整型

def add(x, y, z, mod): # (x + y) % mod % z
    init_poly = poly.polyadd(x, y) # 多项式相加
    res_poly = poly.polydiv(init_poly % z, mod)[1] % z # 多项式相除,取余数
    return np.int64(np.round(res_poly)) # 四舍五入,转整数

def q2(lenth1): # 包含 0 和 1 的随机整数数组 长度为128
    return np.random.randint(0, 2, lenth1, dtype=np.int64)

def qz(z, lenth1): # 包含 0 - z 的随机整数数组 长度为128
    return np.random.randint(0, z, lenth1, dtype=np.int64)

def guess(lenth1): # 每个元素都服从均值为 0,标准差为 2 的正态分布
    return np.int64(np.random.normal(0, 2, size=lenth1))

def jlkey(lenth1, z, mod):
    s = q2(lenth1) # 包含 0 和 1 的随机整数数组 长度为128
    g = qz(z, lenth1) # 包含 0 - 2 ** 62 的随机整数数组 长度为128
    e1 = guess(lenth1) # # 每个元素都服从均值为 0,标准差为 2 的正态分布
    t = add(mul(g, s, z, mod), e1, z, mod) # (((g * s) % mod) + e1) % mod % n
    key = [g, t, s]
    return key # g, (((g * s) % mod) + e1) % mod % n, s
#             128  2^62 2^32
def jl(key, length1, n, p, mod, msg):
    jlm = []
    mm = hex(msg)[2:]
    for i in range(0, len(mm)):
        jlm.append(ord(mm[i]))

    m = np.array(jlm + [0] * (length1 - len(jlm)), dtype=np.int64) % p
    d = n // p
    dm = d * m % n
    e2 = guess(length1)
    e3 = guess(length1)
    r = q2(length1) # e2,e3,r,s个小向量
    g = key[0]
    t = key[1]
    w = add(add(mul(t, r, n, mod), e2, n, mod), dm, n, mod)
    v = add(mul(g, r, n, mod), e3, n, mod)
    c = [w, v]
    return c

o = 128
n = 2 ** 62
p = 2 ** 32
mod = np.array([1] + [0] * (o - 1) + [1])

w = [4456121292753321984, 2695388220323384832, 1125798304404134912, 1389165333028469760, 3720515311443086336, 1806160162087117824, 1710165564223285248, 3854525633894178816, 4160032803226148864, 3223993978734964736, 188029029972998144, 2283288149728718848, 178098730553155584, 400166020473782272, 4426677526375129088, 1768526165797007360, 4596103848246980608, 3143341953117548544, 4113813229295153152, 1444787342796136448, 1749143783191330816, 601663717837410304, 1976180375223943168, 899486064067571712, 2467702122158211072, 1442313048691163136, 2977506408218411008, 1106991111199326208, 844904722420957184, 1013497211561496576, 4250614525386129408, 1677797764964532224, 4212901529405988864, 2561734724771299328, 1890807629146202112, 951039123411230720, 881428262835757056, 514344970914586624, 3072465238399721472, 1294633561516974080, 4471068621313253376, 2978038764905480192, 1256294011046658048, 2885789906784919552, 1808546586690191360, 3846883621647482880, 422980376119787520, 3401510714240147456, 3024926897503240192, 3504641379026477056, 2686993749796929536, 4084804987293286400, 1949654215988994048, 2949577339713200128, 2514172581835300864, 614361226066452480, 1560522408220647424, 1215782736092413952, 1705607337158410240, 3789095360729792512, 126768310879952896, 3564560282876477440, 4112635401656336384, 488963213586022400, 3263989278014881792, 1190526290525741056, 3726804923972673536, 2773020963465314304, 2008550394681090048, 2877753734522249216, 3318721688589254656, 2685195110085615616, 2120287225013829632, 2837075008393977856, 680647261446750208, 2672034759831756800, 586790221783564288, 4413791420559310848, 753748175057453056, 4156435215025135616, 1753634903657668608, 3868573500772638720, 1065381465124585472, 1951729611177713664, 833463289401663488, 3083559584672243712, 2453364017450852352, 3187954181254758400, 2701962603281113088, 1657135743981748224, 3393942972234113024, 3224375546132267008, 1637663670848045056, 2226464092285288448, 3426678970486587392, 3746864906767974400, 892187878069846016, 1566105953383768064, 1841796609436766208, 102854404605427712, 1384852880673484800, 2187150610629812224, 3960839367218393088, 798293770690805760, 172119736121323520, 2434320282093170688, 3398926147058458624, 858963714965422080, 3371154991043334144, 1537312801335345152, 2963315646558453760, 4058550201296797696, 1544831164568528896, 4296983781331357696, 3597399236973740032, 1172234645379473408, 1811007296491237376, 1364782914640955392, 1942828798540959744, 1312644494190576640, 540671172853423104, 2521681537802540032, 3678999552996606976, 3522586936321518592, 3355286245326997504, 1724989423167225856, 2857616461138001920, 3550411157752463360]
v = [3004075223514152960, 375766571298967040, 3918175633582001664, 298998053399571840, 4539733962165100544, 3415675319003214848, 557497174827461120, 1187181217327680512, 42761045408950272, 4539692406094923776, 3474777010512353280, 807990709249906688, 4401927180657766400, 628439373724332032, 3552565694197467136, 1229559664627433472, 2735485480783970304, 340251515454152704, 535029869298274304, 1089634905489248256, 1745435675342262272, 2211405319829864448, 3166387633265565696, 3356595592575791104, 811586262403354624, 1658544963444764672, 2801381922146680832, 1906405005677551616, 2764661089781948416, 348852661152833536, 2843732326950182912, 3655220640882900992, 2735228541582770176, 984245520265568256, 847631674608009216, 4278557074339209216, 354445030770749440, 552426514839019520, 3037890003690143744, 3845527152479436800, 686613871844605952, 1987014853275738112, 129221415412514816, 884028654840045568, 893161048767537152, 4428861422755028992, 1977654893495033856, 2683055322869915648, 4466344498597339136, 2820131774980661248, 2105607478169853952, 768444766180638720, 212987987936600064, 1576117523911901184, 1650389830627762176, 1915750840791851008, 4109009172913405952, 2218053892260061184, 3863963349465956352, 2990430210085863424, 1274030477779271680, 1711547929466978304, 1157679433574768640, 156097645996949504, 3695677787747401728, 4322888783310766080, 4546024412016992256, 2655974462028947456, 1604656974594400256, 2045021548923273216, 3161689730583207936, 8339332591755263, 2341948229963612160, 3607706207127453696, 469234496887414784, 973715854261501952, 789210633607102464, 4424949506055979008, 1542517731370860544, 182468406585786368, 1807090988320792576, 1850374377172516864, 2618527682038956032, 1262867559425187840, 938222240300924928, 4591256432328728576, 2044671823654682624, 3467964150293766144, 79543117595951104, 2185630104198291456, 3728244444110430208, 156056289984327680, 4390349499275018240, 1751182369256157184, 2162985531302232064, 2761554017168584704, 2829764058526203904, 2028689816016191488, 146286463995781120, 3720834471976288256, 2917463735459491840, 4566476477728677888, 3722002688823242752, 4245856959119122432, 3425954365963665408, 3618936531494342656, 3695636186696466432, 1423352273706041344, 158921080583421952, 4351926341975711744, 3376292832678187008, 3295795181429579776, 3267875754319810560, 2363850527793784832, 888488262224822272, 1097387081646508032, 3686827109357189120, 297511993689784320, 3698586652027076608, 1126524981060736000, 1227462499250052096, 195965752955788032, 378621325977167872, 4568860371418834944, 3806982850127191040, 2330191690590402560, 965690431040995328, 2254601344237207552]
g = [1271385667288255999, 3597939031086288160, 948720385886874982, 3730034896312885091, 155961058571645646, 873298702409407364, 3695415802847080551, 3935805697420664465, 303427777773526115, 2121504102169723388, 3117842710535023914, 2004730725267082784, 315298886702225235, 711790101004272712, 3469726824196756845, 3649946521480214795, 4269586158067475466, 1607685984041888423, 1866766258134518609, 4115571819844332380, 2381299916655519619, 2208948036365614734, 1946214530009282102, 330799912617809735, 3460498231343524429, 2694359423578749492, 793704330311549271, 1491532600134534859, 1606672420502700650, 561106526228105342, 1105025457886824442, 1443932433209975334, 4240908184445005305, 1954646486670721382, 4227369777555389059, 1563814260527576306, 771217858163031033, 1280424786084049063, 303853418224126180, 181918673882271714, 2212581027220765469, 2111888312694611250, 3581354821166105988, 1429049683930421764, 1357441041735699015, 3553280165847887597, 869489768651033960, 1107714765447012644, 2910143081602408601, 1433461290183315706, 3240132019514117541, 2465292834002904411, 1334470694725903257, 3156578894981065904, 35185442949043438, 645993467993501426, 1352915688916657829, 1521946784078789166, 2639858512187877401, 4315064694485922395, 3953315792354490874, 1587769214913102261, 3912000075342935904, 1887499577531299413, 309657057763429254, 769590223035802807, 4361036733963754384, 1446528785602732156, 1205711736426995533, 3683188791797133788, 921287773622604679, 3591274357626650529, 2745859155549230842, 4491978210538609848, 2444128709624329128, 1403888264551474491, 4377727165055311964, 1507498290240201527, 2952796830041690744, 1642562262970195060, 2847743992975447391, 4164239208310834247, 1967003682977431435, 2575799088251274004, 156708464748056204, 2403917842083313594, 55721043545237639, 239916744182811448, 134638877854791156, 76687455444928683, 3051612621194354938, 4253947515818696559, 392166402534779315, 5415521347314633, 1816697745794261287, 2282876916808180261, 3667412627019328976, 4211876289328416715, 1647128252024708114, 3721877072126461741, 2297068963395433648, 398583411660274597, 3562855580894975650, 1322989240042277117, 3551729861626536144, 2816759739903316271, 2629395545611893101, 1799561289667084873, 2629410111371391637, 1398369600901640698, 447266788926484707, 405213767544537836, 3014220918160576578, 747208265285548041, 1727187447678753569, 3063564852472463780, 1502638600503176791, 3284205888928186113, 3412854446691461073, 3937011809364193960, 1208514509487198642, 3063044796627572289, 2532417142719581087, 375928502591586817, 2839325684818922862, 4472409225244809142, 1384186637673587546, 1680318030162086049]
t = [3482937270284373504, 3729542463939501056, 1354530592839269376, 2340035975483411456, 3318144666530505728, 4321971466042776576, 4107840020098758656, 2600042509314867200, 3185315495632337920, 2510425761632839680, 3758844697217568768, 1813627045100445696, 1035634427310004224, 1650895865179787264, 931858574122051584, 3821738968282525696, 751354306590687232, 812159733109825536, 1984846083975063552, 426674528748978176, 1786129270688538624, 53204613942820864, 4207648582990901248, 2441413890227052544, 4573249524143439872, 2901255116891488256, 3331287389413953536, 1594453621617430528, 7636565623463936, 3261865719383670784, 3211543945355886592, 4414864510393499648, 1781787468450406400, 4381257290165919744, 1683943310183464960, 1618102318685454336, 3082727664554508288, 1284750602156802048, 4536273674447527936, 4224428964375134208, 1990811212107251712, 220641709431201792, 56727929599156224, 1394394833783595008, 474539825790402560, 2367070412709519360, 86013256530493440, 3983263247386468352, 4488230536002330624, 1131832099054157824, 4470326732790874112, 2361104703887433728, 1850267988673478656, 519014833878171648, 2447115942472581120, 2567048274520276992, 3409815404144214016, 2569012418791473152, 2239861171203006464, 3207035079062069248, 1423032481934245888, 3660676895628648448, 3197924030326439936, 2173721402472767488, 1836499846562930688, 1193190307175825408, 2757965850888388608, 3833547905923039232, 113362523505639424, 2095507640221974528, 695818728283136000, 2746136108677742592, 80271849461956608, 544596706215608320, 857894362373431296, 1801819582386577408, 2748888436946362368, 1760827740054806528, 2544591920627023872, 4324861829346312192, 3073160513540464640, 3260750497480876032, 1268136159796920320, 2738758060057362432, 460370852221685760, 3694812482865025024, 674485732026892288, 31827325234905088, 1076067066569760768, 3538749128687951872, 4553745898606747648, 3332219178735149056, 329835532944998400, 4576690061027602432, 3023286444576161792, 1797946474203955200, 4558389623053447168, 1790588264296259584, 3017170271014150144, 991463616551034880, 1940023178234544128, 3414390445152993280, 644333657859764224, 3692106158122917888, 3167684436092710912, 789204772426006528, 4353661356398166016, 2000540208800374784, 3942168043465134080, 3332450567729246208, 2627875622523490304, 9371534919516160, 848644069081235456, 2192689498702295040, 907016265148577792, 2645935549696630784, 2590866188404383744, 3750676748846913536, 3694849270404139008, 4268369840164233216, 3556945000413347840, 1995615102316576768, 4445424004994387968, 2929133498761163776, 2462149674675616768, 741748174115656704, 39754566828455680, 4477497218304360448]
s = [1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1]

vv = [-i % n for i in v]
res = add(w,mul(s,vv,n,mod),n,mod)

tmp1 = (res // 2 ** 30)[:6 * 13 - 2]
tmp2 = (res % 2 ** 30)[:6 * 13 - 2]
print(tmp1)
m = ''
for i in range(len(tmp1)):
    if tmp2[i] > 1000000:
        m += chr(tmp1[i] + 1)
    else:
        m += chr(tmp1[i])

print(long_to_bytes(int(m,16)))
# HSCCTF{vb6fh8gd7fy87jht7fgyt7g89gb9dn}

浅记一下:
关键词:丢番图方程数学推导Hilbert曲线rlwe

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值