2020網鼎杯 白虎組crypto:bs4


這道密碼學題..我...腦洞不出來

下載得到“密文.txt”內容如下,根據提示bs4是base64加密

密文:uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouz

泄露的密文:pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF=
泄露的明文:ashlkj!@sj1223%^&*Sd4564sd879s5d12f231a46qwjkd12J;DJjl;LjL;KJ8729128713

所以將泄露的明文進行base64加密得到正經密文:YXNobGtqIUBzajEyMjMlXiYqU2Q0NTY0c2Q4NzlzNWQxMmYyMzFhNDZxd2prZDEySjtESmpsO0xqTDtLSjg3MjkxMjg3MTM=

位數和泄露密文一樣,想到了凱撒加密,但是凱撒不行,又想到了維基利亞加密,所以這里把泄露密文和正經密文進行比較得到一個字典

a='pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF'
b='YXNobGtqIUBzajEyMjMlXiYqU2Q0NTY0c2Q4NzlzNWQxMmYyMzFhNDZxd2prZDEySjtESmpsO0xqTDtLSjg3MjkxMjg3MTM'
s=''
a_list =[]
b_list= []
for i in a:
          a_list.append(i)
for i in b:
          b_list.append(i)
for i in range(0,len(a)):
          print(b_list[i],':',ord(b_list[i])-ord(a_list[i]),end='\t\t')
          #print('\'',a_list[i],'\'',':',ord(a_list[i])-ord(b_list[i]),end=',')

用這個字典去解泄密密文是可以解出泄露明文的,換成需要求的密文:uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouzF

悲劇來了,有六個字母不在字典里,想來想去,也沒找到規律可以推出這六個字母對應的值,所以暴力破解吧

import base64
d={'p':23,'T':-4,'j':28,'M':-34,'w':21,'J':3,'9':-59,'W':-26,'i':32,'Q':-4,'H':6,'f':-20,'v':21,'C':-39,'+':-26,'e':-20,'F':-7,'C':-39,'F':-7,'K':-33,'T':-4,'B':-39,'p':23,'W':-26,'Q':-4,'t':66,'m':28,'g':55,'j':28,'o':27,'p':23,'g':55,'q':14,'t':66,'m':28,'P':28,'j':28,'f':-20,'K':-33,'f':-20,'j':28,'S':-4,'m':28,'d':-20,'F':-7,'L':-33,'p':23,'e':-20,'F':-7,'f':-20,'/':-23,'A':-39,'j':28,'2':-18,'u':27,'d':-20,'3':-49,'t':66,'N':-34,'7':-59,'u':27,'2':-18,'+':-26,'e':-20,'n':27,'C':-39,'9':-59,'+':-26,'n':27,'L':-33,'N':-34,'8':-59,'k':28,'g':55,'d':-20,'W':-26,'o':27,'2':-18,'9':-59,'Z':14,'n':27,'C':-39,'r':11,'O':28,'F':-7,'C':-39,'D':-39,'d':-20,'F':-7,'C':-39,'r':11,'O':28,'F':-7,'o':27,'F':-7}

miwen="uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouzF"

s=''
i=0

for j in miwen:
          if j=='E' or j=='I' or j =='G' or j=='s' or j=='X' or j=='z':
                    s += j
          else:
                    tmp = ord(j)
                    #print(d[j],end='\t')
                    #print(chr(tmp-d[j]),end='')
                    s += chr(tmp-d[j])
                    
          #print('ss',j)

out=[]

flag='flag'
s_tmp = s
for a in range(65,123):
          s_tmp.replace('E',chr(a))
          out.append(s_tmp)
          s_tmp = s
          for b in range(65,123):
                    s_tmp.replace('I',chr(b))
                    out.append(s_tmp)
                    s_tmp = s
                    for c in range(65,123):
                              s_tmp.replace('G',chr(c))
                              out.append(s_tmp)
                              s_tmp = s
                              for d in range(65,123):
                                        s_tmp.replace('s',chr(d))
                                        out.append(s_tmp)
                                        s_tmp = s
                                        
                                        for e in range(65,123):
                                                  s_tmp.replace('X',chr(e))
                                                  out.append(s_tmp)
                                                  s_tmp = s
                                                  for f in range(65,123):
                                                            s_tmp.replace('z',chr(f))
                                                            out.append(s_tmp)
                                                            s_tmp = s
                                        
          
                              
for i in out:
          i +='='
          try:
                    code = base64.b64decode(i)
                    if flag in coed:
                              print(code)
          except:
                    continue
                    
                              
                              

out[i]=s
flag='flag'
for i in out:
          if( flag in base64.b64decode(i)):
                    print(i)

好的,沒有flag因為內存錯誤啦~~數字太多超出內存,沒辦法,等writeup吧

wp出了,說是靠猜,不知道他們怎么猜的,我是這么猜的:

原密文經過字典翻譯,有五個字母翻譯不出來以?代替

ZmxhZ3sxZTNhMm?lN?0xYz?yLT?mNGYtOWIyZ??hNGFmYW?kZj?xZTZ?M

對flag字符串進行base64加密,發現和密文開頭一樣

 

嘗試以?作為分隔符把每一段密文解出來

第一段:flag{1e3a2

第二段:\x96

第三段:\xd3\x163

第四段:\x98\xd1\x98\xb4\xe5\x88\xc9

第五段:\x84\xd1\x85\x99\x85

第六段:...

從第一段開始爆破下一個flag字符

s='flag{1e3a2'
tmp=s
for i in range(97,128):
          s += chr(i)
          out=base64.b64encode(s.encode('utf-8'))
          str1=''
          for j in range(0,len(out)-1):
                    str1 += chr(out[j])
          str1 += 'lN=='
          try:
                    print(base64.b64decode(str1))
          except:
                    continue
          s=tmp

得到如下結果,當第一段后兩個字符為de時,符合密文?之后是l

 假設第一段后面是de,繼續往后爆破,沒有密文l之后是N的結果

s='flag{1e3a2de'
tmp=s
for i in range(97,128):
          s += chr(i)
          out=base64.b64encode(s.encode('utf-8'))
          print(out)
          str1=''
          for j in range(0,len(out)-1):
                    str1 += chr(out[j])
          str1 += '0xYz=='
          try:
                    print(base64.b64decode(str1))
          except:
                    continue
          s=tmp

換爆破范圍為數字,4,5,6,7符合l之后是N

 因為flag的形式是uuid:8-4-4-12,數字之后就是短橫線-,所以從第一個數字帶入flag查看base64加密后的值和題中給的那個數字一樣

s='flag{1e3a2de'
tmp=s
for i in range(52,56):
          s +=chr(i)
          s += '-'
          print(s)
          print(base64.b64encode(s.encode('utf-8')))
          s=tmp

都是0,沒有更往后的數字來判斷

 那只有在4,5,6,7的base64加密上接上題目中的密文

s='flag{1e3a2de'
tmp=s
for i in range(52,56):
          s += chr(i)
          s += '-'
          out=base64.b64encode(s.encode('utf-8'))
          print(out)
          str1=''
          for j in range(0,len(out)-1):
                    str1 += chr(out[j])
          str1 += 'xYz=='
          try:
                    print(base64.b64decode(str1))
          except:
                    continue
          s=tmp

都能解出來,那么說明目前這四個數字都有可能,排除不了,繼續往后猜,套路和前面一樣

 最后猜出來的結果是flag{1e3a2de5-1c02-4f4f-9b2e-a4afabdf01e6}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM