题目: OBZXGZL3NFVHOZTLMUWTANRQGYZDMMJYGE4H2=== 情报显示,...
Erstellt am: 17. Juni 2026
Beantwortet mit GPT-5.5 Thinking von Chat01
Erstellt am: 17. Juni 2026
Beantwortet mit GPT-5.5 Thinking von Chat01
题目:
OBZXGZL3NFVHOZTLMUWTANRQGYZDMMJYGE4H2===
情报显示,这份文件经过了多层的加密保护,使用了古典密码学中多种经典算法的组合。你需要运用你全部的密码学知识来逐层破解它!
提示:
第一层OBZXGZL3NFVHOZTLMUWTANRQGYZDMMJYGE4H2===是用base32解码得psse{ijwfke-0606261818}但这不是最终得flag
帮我找到flag
pythonimport 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))
pythondef 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])))
pythons='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, '}')])
pythondef 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))
pythondigits='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')))
pythonfor 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))
pythondef 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)
pythonletters='psseijwfke' for r in range(2,8): print(r, rail_fence_decrypt(letters,r))
pythondef 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))
pythoncts='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)
pythonimport 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))
pythonfor 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)
pythonfor 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)))
pythondef 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)
pythondig='0606261818' for r in range(2,7): print(r, rail_fence_decrypt(dig,r), rail_fence_encrypt(dig,r))
pythondef 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
pythonimport pkgutil, sys mods=['wordfreq','wordninja','wordfreq','wordnet','wordfreq'] print([m for m in mods if pkgutil.find_loader(m)])
pythonfrom 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)
pythonpat=''.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))
pythonkeys=['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
最终 flag 是:
textflag{crypto-0606261818}
破解链路:
textOBZXGZL3NFVHOZTLMUWTANRQGYZDMMJYGE4H2=== ↓ Base32 解码 psse{ijwfke-0606261818} ↓ 凯撒位移 +8 / ROT8 xaam{qrensm-0606261818} ↓ Beaufort 密码,key = classic flag{crypto-0606261818}
所以提交:
textflag{crypto-0606261818}