第四届浙江省大学生网络与信息安全竞赛(决赛)dssssa1复现

附件下载得到的encode脚本:

from Crypto.Util.number import *
import random
from gmpy2 import *
from hashlib import sha1
from secret import flag


m = bytes_to_long(flag)
q = getPrime(160)

while True:
    p = getPrime(1024)
    if (p-1) % q == 0:
        break
        
h = random.randint(1, p-2)
g = powmod(h, (p-1)//q, p)
x = random.randint(1, q-1)
y = powmod(g, x, p)

k = random.randint(1, q-1)
h = bytes_to_long(sha1(flag).digest())
r = powmod(g, k, p) % q
s = (h + x*r) * invert(k, q) % q

c = powmod(m, x, p*q)

print(p, q, g, y, h, r, s, c, k, sep=',')

# p = 94515040220263097875872541668071470619435707358211716562219917331797767488022053087267566586709944785329708571559126640339609375166385904147189950035630910404534642622114804635856314928438531544553236458244225698694846607333226704467932079712515971615643868209281460429629880920550469170449935295454629293399
# q = 1001535514136994695529636128311212301250326767869
# g = 89288700225171676599759774184146798321191748739703246395529001979988401303800066044674449834184095667747898974375431700503800142840899194492182057885675147681600217979466719692984863330298347742657472936559041930489702116255999412448996714923112824244267910808782794442895518685864174817501040060680962447941
# y = 93887528695360292524813814240190328732283663255426806128197957720674496260060703595933676082882204724501085633424942582304707395449222043328895852812543576418567716781870179606049899540449729036771290550645770978667075821043797569255787271932556218014920373462882329802597672026806552417735660553144344650642
# h = 775593521305134275967472254218401264703166138817
# r = 75084117510316201869105133948164969652170742276
# s = 599417004454208825884865529281453774324093134827
# c = 94203926294365722030261882520165826558476099177297861176153811285238289485953276649563642144753132730431066372867407177248194182778827143183520415437355921352580608448713381897280433120409711633310458263502217605470824497215111936036532237050330222480782799188409969149722885261258984444311562364318406725475829089368796269160936194172040318140462371217663
# k = 208672457767877303895327222020982963931779123819

题给的变量很多,开始拿到这题的时候愣住了,但是不难看出来x是这题的关键,求出x即可正常解RSA。

赛后看了4xwi11佬的博客才发现,这题真的不难QAQ

告诉了

s = (h + x*r) * invert(k, q) % q

根据这一加密就不难推测出x

x = ((s * k -h)*invert(r,q))%q

呜呜呜,佬说简单推导都不算。

贴上exp:

from gmpy2 import *
from Crypto.Util.number import *

p = 94515040220263097875872541668071470619435707358211716562219917331797767488022053087267566586709944785329708571559126640339609375166385904147189950035630910404534642622114804635856314928438531544553236458244225698694846607333226704467932079712515971615643868209281460429629880920550469170449935295454629293399
q = 1001535514136994695529636128311212301250326767869
g = 89288700225171676599759774184146798321191748739703246395529001979988401303800066044674449834184095667747898974375431700503800142840899194492182057885675147681600217979466719692984863330298347742657472936559041930489702116255999412448996714923112824244267910808782794442895518685864174817501040060680962447941
y = 93887528695360292524813814240190328732283663255426806128197957720674496260060703595933676082882204724501085633424942582304707395449222043328895852812543576418567716781870179606049899540449729036771290550645770978667075821043797569255787271932556218014920373462882329802597672026806552417735660553144344650642
h = 775593521305134275967472254218401264703166138817
r = 75084117510316201869105133948164969652170742276
s = 599417004454208825884865529281453774324093134827
c = 94203926294365722030261882520165826558476099177297861176153811285238289485953276649563642144753132730431066372867407177248194182778827143183520415437355921352580608448713381897280433120409711633310458263502217605470824497215111936036532237050330222480782799188409969149722885261258984444311562364318406725475829089368796269160936194172040318140462371217663
k = 208672457767877303895327222020982963931779123819

n = p * q
phi = (p-1) * (q-1)
#s = (h + x*r) * invert(k, q) % q
x = ((s * k -h)*invert(r,q))%q
#print(x.bit_length())
d = invert(x,phi)
m = pow(c,d,n)
print(long_to_bytes(m))

运行即可得到:

160
b'DASCTF{1d6f9460a596a4b38acc7263ea37b84d}'
上一篇:【leetcode】1545. Find Kth Bit in Nth Binary String


下一篇:java-反转JTable中的选择