题目: OBZXGZL3NFVHOZTLMUWTANRQGYZDMMJYGE4H2=== 情报显示,...

Creado el: 17 de junio de 2026

Respondido usando GPT-5.5 Thinking por Chat01

Pregunta

题目:
OBZXGZL3NFVHOZTLMUWTANRQGYZDMMJYGE4H2===
情报显示,这份文件经过了多层的加密保护,使用了古典密码学中多种经典算法的组合。你需要运用你全部的密码学知识来逐层破解它!

提示:
第一层OBZXGZL3NFVHOZTLMUWTANRQGYZDMMJYGE4H2===是用base32解码得psse{ijwfke-0606261818}但这不是最终得flag

帮我找到flag

Python

python
import string s='psse{ijwfke-0606261818}' alpha=string.ascii_lowercase for shift in range(26): trans=str.maketrans(alpha, alpha[shift:]+alpha[:shift]) print(shift, s.translate(trans))

Python

python
def atbash(s): res='' for ch in s: if ch in alpha: res+=alpha[25-alpha.index(ch)] else: res+=ch return res a=atbash(s) print(a) for shift in range(26): print(shift, a.translate(str.maketrans(alpha, alpha[shift:]+alpha[:shift])))

Python

python
s='psse{ijwfke-0606261818}' len(s), list(enumerate(s)) (23, [(0, 'p'), (1, 's'), (2, 's'), (3, 'e'), (4, '{'), (5, 'i'), (6, 'j'), (7, 'w'), (8, 'f'), (9, 'k'), (10, 'e'), (11, '-'), (12, '0'), (13, '6'), (14, '0'), (15, '6'), (16, '2'), (17, '6'), (18, '1'), (19, '8'), (20, '1'), (21, '8'), (22, '}')])

Python

python
def vigenere_decrypt(ct,key): res=''; j=0 for ch in ct: if ch in alpha: res+=alpha[(alpha.index(ch)-alpha.index(key[j%len(key)]))%26]; j+=1 else: res+=ch return res for key in ['key','ctf','flag','crypto','cipher','classical','caesar','vigenere','base','bacon','railfence','rail','atbash','rot']: print(key, vigenere_decrypt(s,key))

Python

python
digits='0606261818' def decrypt_digit_key(ct,digs): res=''; j=0 for ch in ct: if ch in alpha: d=int(digs[j%len(digs)]) # single digit shifts res+=alpha[(alpha.index(ch)-d)%26]; j+=1 else: res+=ch return res print(decrypt_digit_key('psseijwfke',digits)) # use pairs 06,06,26,18,18 mod 26 pairs=[6,6,26,18,18] res='' for i,ch in enumerate('psseijwfke'): res+=alpha[(alpha.index(ch)-pairs[i%len(pairs)])%26] print(res) # use pairs encrypt? print('enc pairs',''.join(alpha[(alpha.index(ch)+pairs[i%len(pairs)])%26] for i,ch in enumerate('psseijwfke')))

Python

python
for key in ['ffzrr','ggasi','0606261818','06061818','ffsrr','ffzrr']: keyletters=''.join(c for c in key if c.isalpha()).lower() or ''.join(alpha[int(d)%26] for d in key if d.isdigit()) print(key,keyletters,vigenere_decrypt('psseijwfke',keyletters))

Python

python
def rail_fence_decrypt(cipher, rails): # standard zigzag if rails==1: return cipher # pattern indices pattern=list(range(rails))+list(range(rails-2,0,-1)) rail_nums=[pattern[i%len(pattern)] for i in range(len(cipher))] counts=[rail_nums.count(r) for r in range(rails)] rails_str=[] pos=0 for c in counts: rails_str.append(list(cipher[pos:pos+c])); pos+=c out=[] pointers=[0]*rails for r in rail_nums: out.append(rails_str[r][pointers[r]]); pointers[r]+=1 return ''.join(out) for r in range(2,12): t=rail_fence_decrypt(s,r) print(r, t)

Python

python
letters='psseijwfke' for r in range(2,8): print(r, rail_fence_decrypt(letters,r))

Python

python
def rail_fence_encrypt(text, rails): if rails==1: return text pattern=list(range(rails))+list(range(rails-2,0,-1)) rails_str=['' for _ in range(rails)] for i,ch in enumerate(text): rails_str[pattern[i%len(pattern)]]+=ch return ''.join(rails_str) for r in range(2,8): print(r, rail_fence_encrypt(s,r), rail_fence_encrypt(letters,r))

Python

python
cts='psseijwfke' candidates=['cipher','secret','crypto','caesar','decode','encode','hidden','answer','puzzle','vigenr','vigenere','classi','atbash','affine','simple','double','threee','base32','railfe','riddle','dragon','attack','ceshi','jiefu','ctfxxx','origin','middle','format'] def key_for(pt, ct=cts): ks=[] for c,p in zip(ct,pt): ks.append(alpha[(alpha.index(c)-alpha.index(p))%26]) return ''.join(ks) for cand in candidates: pt='flag'+cand[:6] k=key_for(pt) print(pt,k)

Python

python
import string, math alpha=string.ascii_lowercase def mat_inv2(M, mod=26): a,b=M[0]; c,d=M[1] det=(a*d-b*c)%mod invdet=pow(det,-1,mod) return [[d*invdet%mod, (-b)*invdet%mod],[(-c)*invdet%mod, a*invdet%mod]] def hill_dec_letters(ct,M): Minv=mat_inv2(M) nums=[alpha.index(ch) for ch in ct] out='' for i in range(0,len(nums),2): x,y=nums[i],nums[i+1] p=(Minv[0][0]*x+Minv[0][1]*y)%26 q=(Minv[1][0]*x+Minv[1][1]*y)%26 out+=alpha[p]+alpha[q] return out for M in [[[12,3],[3,5]],[[25,16],[3,5]]]: print(M, mat_inv2(M), hill_dec_letters('psseijwfke',M))

Python

python
for word in ['nujgoi','ahwtoi']: print(word) for k in range(26): rotw=rot(word,k) if any(x in rotw for x in ['cipher','secret','caesar','answer','crypto','hidden','flag','decode','attack','matrix']): print(k,rotw) print('atbash',atbash(word)) for k in range(26): w=rot(atbash(word),k) if any(x in w for x in ['cipher','secret','caesar','answer','crypto','hidden','flag','decode','attack','matrix']): print('ab',k,w)

Python

python
for w in ['nujgoi','ahwtoi']: print(w, 'single', decrypt_digit_key(w,digits)) pairs=[6,6,26,18,18] print('pairs dec', ''.join(alpha[(alpha.index(ch)-pairs[i%len(pairs)])%26] for i,ch in enumerate(w))) print('pairs enc', ''.join(alpha[(alpha.index(ch)+pairs[i%len(pairs)])%26] for i,ch in enumerate(w)))

Python

python
def det_inv(M): a,b=M[0]; c,d=M[1] det=(a*d-b*c)%26 return math.gcd(det,26)==1,det keys={'hill':[[7,8],[11,11]],'gybnqkurp':[[6,24],[1,13]],'test':[[19,4],[18,19]],'abcd':[[0,1],[2,3]],'0606':[[0,6],[0,6]],'2618':[[2,6],[1,8]],'khsy':[[10,7],[18,24]],'keys':[[10,4],[24,18]]} for k,M in keys.items(): ok,det=det_inv(M) if ok: print(k,M,hill_dec_letters('psseijwfke',M)) else: print(k,M,'noninvertible det',det)

Python

python
dig='0606261818' for r in range(2,7): print(r, rail_fence_decrypt(dig,r), rail_fence_encrypt(dig,r))

Python

python
def transforms_word(w): results=[] funcs=[('id',lambda x:x),('rev',lambda x:x[::-1]),('atbash',atbash),('atbashrev',lambda x:atbash(x)[::-1]),('revatbash',lambda x:atbash(x[::-1]))] for name,f in funcs: t=f(w) for k in range(26): results.append((name+' rot'+str(k), rot(t,k))) return results wordlist=['secret','cipher','crypto','caesar','decode','encode','hidden','answer','puzzle','attack','matrix','affine','atbash','letter','number','common','simple','classi','double','flagxx','passwd','phrase','keykey','rotrot','baconx','morsex','railxx'] for w in ['nujgoi','ahwtoi']: for name,u in transforms_word(w): if u in wordlist: print(w,name,u) # contains approximate? print all maybe print('examples for',w) for name,u in transforms_word(w)[:10]: pass

Python

python
import pkgutil, sys mods=['wordfreq','wordninja','wordfreq','wordnet','wordfreq'] print([m for m in mods if pkgutil.find_loader(m)])

Python

python
from collections import deque s='psse{ijwfke-0606261818}' alpha='abcdefghijklmnopqrstuvwxyz' def apply_letters_only(text, func): letters=[ch for ch in text if ch in alpha] new=func(''.join(letters)) it=iter(new) return ''.join(next(it) if ch in alpha else ch for ch in text) def ops(text): outs=[] # rot all except 0? for k in range(1,26): outs.append((f'rot{k}', rot(text,k))) outs.append(('atbash', atbash(text))) outs.append(('reverse', text[::-1])) for r in range(2,12): outs.append((f'raildec{r}', rail_fence_decrypt(text,r))) outs.append((f'railenc{r}', rail_fence_encrypt(text,r))) outs.append((f'letters_raildec{r}', apply_letters_only(text, lambda (0, 74694)

Python

python
pat=''.join('a' if ch in 'aeiou' else 'b' for ch in 'psseijwfke') print(pat) def bacon_decode(pat): outs=[] for flip in [False,True]: letters='' for i in range(0,len(pat),5): group=pat[i:i+5] if len(group)<5: continue bits=''.join(('1' if c=='b' else '0') for c in group) if flip: bits=''.join('1' if b=='0' else '0' for b in bits) val=int(bits,2) letters+=alpha[val] if val<26 else '?' outs.append((flip,letters)) return outs print(bacon_decode(pat))

Python

python
keys=['key','ctf','flag','crypto','cipher','classical','classic','caesar','vigenere','base','base32','bacon','railfence','rail','atbash','rot','hill','playfair','secret','password','matrix','decode','encode','affine','morse','polybius','keyboard','number','date','khsy','ffzrr','ggass','0606261818'] def vig(text,key,mode='dec'): res=''; j=0 for ch in text: if ch in alpha: k=alpha.index(key[j%len(key)]) x=alpha.index(ch) res+=alpha[(x-k)%26] if mode=='dec' else alpha[(x+k)%26] j+=1 else: res+=ch return res def beaufort(text,key): # plaintext = key - cipher? decryption same res=''; j=0 for ch

Pensamiento

Decoding the cipher using classical methods

I found the solution: Applying ROT8 and then the Beaufort cipher with the key "classic" gives the expected flag{crypto-0606261818}! The steps involve decoding from Base32, applying ROT8 for Caesar shift, and then decrypting with Beaufort. The "classic" key fits the clue from "古典密码学," confirming the sequence.

Thought for 12m 5s

Respuesta

最终 flag 是:

text
flag{crypto-0606261818}

破解链路:

text
OBZXGZL3NFVHOZTLMUWTANRQGYZDMMJYGE4H2=== ↓ Base32 解码 psse{ijwfke-0606261818} ↓ 凯撒位移 +8 / ROT8 xaam{qrensm-0606261818} ↓ Beaufort 密码,key = classic flag{crypto-0606261818}

所以提交:

text
flag{crypto-0606261818}

Compartir este Q&A