复现CISCN2022-华南分区赛的一道Crypto题-BlindSignatureRSA

2022-6-20 CryptoRSARSA盲签名CISCN2022

# Blind_Signature_RSA

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

flag = b"DASCTF{xxxxx}"
e = 65535
p = getPrime(1024)
q = getPrime(1024)
n = p*q
print(n)
d = invert(e,(p-1)*(q-1))
print(d)
r = getPrime(20) #r为盲因子

#29483306349489404720842827590417699080088567453458052528577045719229067871933655960110676431576204529914920131171114044341901273830369619888620189716306232584863693529321897778856782588913470346919318225686228244680692987755332006016213134299817308077213832143282536529052309308622294665486115101639504381377868097616904921186796788432671965007660937818882582649119798238775439945212819390385373302229328667996224204360925853488461416863221131179343286484012284714504966356469529185271063778195534665332208048353905112106035065102371026000980008455990519097979977506811731519601088202703134548630374981337483017757979
#7805979224383774491666192134299801582949824275348297389537503933384352737406284650398723533444399554414492701548027768114386648389879351105324619085490645328144807300332101142304784232856300053244786610725287957174863874731712300852785749496240636491153386763074621062265760567847797890300596370314290692321376814127083106794761037978431916357910194715702499792430140190348494292903849206453892243758495922690201078653368390116667498545528794384243880268651761740280666269739930717469468739549671400338383481222977678778911739449754563814017869859624213805436175086753324236921940804237759187246564277533295562599511
#Blind_Sig = 8685054877232600823701099675986598023289758653647145252282377757855491953690949764490300809810226781636260759907258247667728126891310591343277610839896562620369512611349863334794437458103579205338209855091257191717434084932896246828581517270293940357182859128052346003502719228278629494897651664345629978865980327152938655709194947847485047443126110099954505872398194605319580319655591612056626496114638799048580855831556894117779425656259423849348643010454288515541831212622668136971151833363587218834782685761174093377954683955964627511823582698985785696944375817769888226141976629264419123422109812251096969710568
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# RSA盲水印

应用密码学 | 盲签名(Blind Signature) - 知乎 (zhihu.com) (opens new window)

假设A是接收者,B是签名者,私钥 ,并公开RSA公钥 ,A让B盲签消息 ,流程:

  1. A选取盲因子 ,计算
  2. B对 进行签名
  3. A去盲得到原始签名

# 解题

对应到题目,n、d和Blind_Sig分别是 ,现在要求的flag为

由于盲因子 并不大,可以选择遍历爆破,便能求出 ,而对于 ,其中只有 未知,也就是要求的,根据RSA算法可知

可在比赛时,求 写成了 s = Blind_Sig//r ,导致没法解出 ,正确的计算应该为 s = Blind_Sig * invert(r, n)

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

e = 65535
n = 29483306349489404720842827590417699080088567453458052528577045719229067871933655960110676431576204529914920131171114044341901273830369619888620189716306232584863693529321897778856782588913470346919318225686228244680692987755332006016213134299817308077213832143282536529052309308622294665486115101639504381377868097616904921186796788432671965007660937818882582649119798238775439945212819390385373302229328667996224204360925853488461416863221131179343286484012284714504966356469529185271063778195534665332208048353905112106035065102371026000980008455990519097979977506811731519601088202703134548630374981337483017757979
d = 7805979224383774491666192134299801582949824275348297389537503933384352737406284650398723533444399554414492701548027768114386648389879351105324619085490645328144807300332101142304784232856300053244786610725287957174863874731712300852785749496240636491153386763074621062265760567847797890300596370314290692321376814127083106794761037978431916357910194715702499792430140190348494292903849206453892243758495922690201078653368390116667498545528794384243880268651761740280666269739930717469468739549671400338383481222977678778911739449754563814017869859624213805436175086753324236921940804237759187246564277533295562599511
Blind_Sig = 8685054877232600823701099675986598023289758653647145252282377757855491953690949764490300809810226781636260759907258247667728126891310591343277610839896562620369512611349863334794437458103579205338209855091257191717434084932896246828581517270293940357182859128052346003502719228278629494897651664345629978865980327152938655709194947847485047443126110099954505872398194605319580319655591612056626496114638799048580855831556894117779425656259423849348643010454288515541831212622668136971151833363587218834782685761174093377954683955964627511823582698985785696944375817769888226141976629264419123422109812251096969710568

for r in range(1000000):
    # s = Blind_Sig//r
    try:
        s = Blind_Sig * invert(r, n)
    except:
        continue
    m = pow(s, e, n)
    mm = long_to_bytes(int(m))
    if b"DASCTF" in mm:
        print(mm)
        exit()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DASCTF{Oh_You_kn0w_th3_Blind_Sign4ture!}
1