记录一下刷题&比赛中遇到的一些古典密码题
最近更新:2024-12-03
 
[FSCTF 2023]兔帽的奇妙冒险 附件:
1 2 有一只名叫贝斯64 先生的兔子。它戴着一顶古老的兔帽子,帽子上绣着奇异的符文,传说这是一种能与神秘力量连接的魔法帽子。 OFR3 c05 RTEFKM2 Q3 QkxqRGlTbWthWExxSXhrZFo3 SU5 DVWRkOTVFQ2 JUSE1 VcXpRQk9 hc3 hqMzRrbHRJMD0 = 
 
base64 解密一下
8TwsNQLAJ3d7BLjDiSmkaXLqIxkdZ7INCUdd95ECbTHMUqzQBOasxj34kltI0=
再加上 Rabbit 特征的密文头 U2FsdGVkX1  再Rabbit 解密
FSCTF{Bunny_is_so_cute_Why_e@t_bunny} 
[MoeCTF 2021]OldButPopular 
附件
 
1 2 qj3r_y31s{vxk7_hig__0_a}g4ax_x0x540slv 你能解密出这段是什么意思吗? 观察一下这段密文格式有什么不一样 
 
一看就是移了顺序的,而且 {} 也移了,栅栏密码:所有字母变换位置但字母不变
这题的flag头 不是 flag就是 moectf,密文里没有,那就是字母变换了,大概是凯撒加密了
因为凯撒只对26个字母加密,所以{}是不动的,所以我们可以先进行凯撒解密通过 {} 来筛选正确的密文
1 qsigxj {g453v_a4rx_x0_k0_sy7_xl3_a0v1h} 
 
在线网址枚举或者随波逐流一把梭
1 moectf{c453 r_w4 nt_t0 _g0 _ou7 _th3 _w0 r1 d} 
 
 
加密原理:
凯撒密码在线加密解密 - 千千秀字 (qqxiuzi.cn) 
栅栏密码在线加密解密 - 千千秀字 (qqxiuzi.cn) 
户外天堂 
湘赣边武功山论剑 
 
1 这里是修炼之人的梦想之地,风景如画、宁静安详,少侠可以联系尚宝司少卿“张程”大人,在这里稍作休息,恢复体力,继续冒险。 
 
1 张程大人:或许维吉尼亚密码在比武中能派上用场。这种加密方法通过变换字母顺序和使用不同的密钥,能有效保护通信内容,对于保密传输至关重要,值得深入研究和应用。 
 
1 2 kr0 gMDY1 NTY5 MDghNTU5 MsozMhU5 MzUgNiM3 NTI0 ODI5 MsA2 MrE3 CmU9 NsU1 MhcKYz01 NTkyOTk4 MDM2 Mio3 Mrg0 OTYfODE0 OTcfNjUhMiA0 MhUiODM= key:rsa 
 
小改了一下字典,加密字典变成了小写字母,除小写外其他字符不变
因为字典的不同,所以在线网站和 工具都解不对,只能自己敲代码
所以我们需要理解原理来进行编写
1,$len(key) \le len(message)$ ,当密钥的长度小于明文长度时,需要重复拼接key到相同长度
2,
注:模数 26 是 字典的长度,即 p = len(table) ,字典长度为几,模数为几
Mi 就是 M这个明文在字母表中的索引值,比如表是 abcdefghijklmnopqrstuvwxyz, 假如 M 为 b, 那 Mi 就表示 1   (表是a-z,下标也就是0-25)
同样,Ki 就是 Mi 所对应的 K的索引值,假设明文 M 对应的是密钥 r,在表中的索引值就是 17,于是 Ki=17
具体可以结合下面的exp进行理解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import  base64def  pad_key (key, length ):    Key = key * length     return  Key[:length] def  encrypt (message, table, key ):    enc = ''      Key = pad_key(key, length)     for  i in  range (length):         if  message[i].islower():             enc += table[(table.index(message[i]) + table.index(Key[i])) % len (table)]         else :             enc += message[i]     return  enc message = 'kr0gMDY1NTY5MDghNTU5MsozMhU5MzUgNiM3NTI0ODI5MsA2MrE3CmU9NsU1MhcKYz01NTkyOTk4MDM2Mio3Mrg0OTYfODE0OTcfNjUhMiA0MhUiODM='  table = 'abcdefghijklmnopqrstuvwxyz'  key = 'rsa'  length = len (message) print (base64.b64decode(encrypt(message,table,key)).decode())
 
rsa 就不解释了
1 2 3 4 5 6 7 8 9 10 11 12 13 import  libnumfrom  xenny.ctf.crypto.modern.asymmetric.rsa import  factorn=1065569082559283359352737524829206217  e=65537  c=557299803638728496181497065330435383  p,q = factor.attack(n) d=libnum.invmod(e,(p-1 )*(q-1 )) m = pow (c,d,n) print (libnum.n2s(pow (c,d,n)))
 
easy_crypto 
2024-09-05
 
1 2 3 4 key.txt 1091091153210977773210977109457732774646324677831153277464546324611511545838377321098377 flag.rar 
 
题目内容:谐音一点都不好玩,但好在差别不大。
尝试了很多,最后可能是拼凑的ascii码,
1 2 3 4 5 6 7 8 9 10 str  = '1091091153210977773210977109457732774646324677831153277464546324611511545838377' num = 0  while  num <= len (str ):    for  j in  range (2 , 4 ):         if  32  <= int (str [num:num + j]) <= 126 :             print (chr (int (str [num:num + j])), end='' )             num += j 
 
ms,摩斯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 str  = 'mms mMM mMm-M M.. .MSs M.-. .ss-SSM mSM' M = ['M' , 'm' , '.' ] S = ['S' , 's' , '.' ] for  i in  str :    if  i in  M:         print ('.' , end='' )     elif  i == ' ' :         print ('/' , end='' )     else :         print ('-' , end='' ) print ()for  i in  str :    if  i in  S:         print ('.' , end='' )     elif  i == ' ' :         print ('/' , end='' )     else :         print ('-' , end='' ) 
 
得到key:GO0DLC$K
打开flag压缩包是一大堆base
由结果可知进行了50次base64加密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import  re, base64s = open ('flag.txt' , 'rb' ).read() base16_dic = r'^[A-F0-9=]*$'  base32_dic = r'^[A-Z2-7=]*$'  base64_dic = r'^[A-Za-z0-9/+=]*$'  n= 0  while  True :    n += 1      t = s.decode()     if  '{'  in  t:         print (t)         break      elif  re.match (base16_dic, t):         s = base64.b16decode(s)         print (str (n) + ' base16' )     elif  re.match (base32_dic, t):         s = base64.b32decode(s)         print (str (n) + ' base32' )     elif  re.match (base64_dic, t):         s = base64.b64decode(s)         print (str (n) + ' base64' ) 
 
Affine 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 import  stringimport  libnumfrom  tqdm import  trangeqwer= 'flag{'     sercet='aipx{823j56p37ap92p93pd4g7ad6a0p01p21}'  dic = string.ascii_lowercase def  affine_decrypt (ciphertext, a, b, dic ):    m = len (dic)     a_inv = libnum.invmod(a, m)     plaintext = ''      for  char in  ciphertext:         if  char in  dic:             y = dic.index(char)             x = (a_inv * (y - b)) % m             plaintext += dic[x]         else :             plaintext += char     return  plaintext n = 26  for  a in  trange(100 ):    for  b in  range (100 ):         c=''          for  j in  qwer:             if  ord (j) >= ord ("a" ) and  ord (j) <= ord ("z" ):                 cha=ord (j)-ord ('a' )                 c+=chr ((a * cha+ b) % n+ord ('a' ))             else :                 c+=j             if  'aipx'  in  c:                 print (c)                 print (a,b)                 print ((affine_decrypt(sercet,a,b,dic)))                 break  
 
cs 
古剑山2024
 
1 jhjnjcjikmkfjjjkkejkkekdjgjcjnjhjnjcjiko 
 
https://en.wiktionary.org/wiki/Appendix:Two-letter_combinations 
容易知道是j和k开头的两个字母来表示一个字母
 
猜测凯撒密码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 hncimfjkekedgcnhncio gmbhleijdjdcfbmgmbhn flagkdhicicbealflagm ekzfjcghbhbadzkekzfl djyeibfgagazcyjdjyek cixdhaefzfzybxicixdj bhwcgzdeyeyxawhbhwci agvbfycdxdxwzvgagvbh zfuaexbcwcwvyufzfuag yetzdwabvbvuxteyetzf xdsycvzauautwsdxdsye wcrxbuyztztsvrcwcrxd vbqwatxysysruqbvbqwc uapvzswxrxrqtpauapvb tzouyrvwqwqpsoztzoua syntxquvpvpornysyntz rxmswptuouonqmxrxmsy qwlrvostntnmplwqwlrx pvkqunrsmsmlokvpvkqw oujptmqrlrlknjuoujpv ntioslpqkqkjmitntiou mshnrkopjpjilhsmshnt lrgmqjnoioihkgrlrgms kqflpimnhnhgjfqkqflr jpekohlmgmgfiepjpekq iodjngklflfehdoiodjp 
 
像也不想像,是k那部分不对,应该是 j和k 分成两部分位移了
1 2 3 4 5 6 7 8 9 10 11 12 a = 'jhjnjcjikmkfjjjkkejkkekdjgjcjnjhjnjcjiko'  for  j in  range (-26 ,26 ):    flag = ''      for  i in  range (0 ,len (a),2 ):         if  a[i] == 'j' :             flag += chr (ord (a[i+1 ])-2 )         else :             flag+=chr (ord (a[i+1 ])+j)     print (flag) 
 
apple 
古剑山
0 sloved
 
1 2 flag_len = 39  cipher_flag = b'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akAQGEppZ0F2AUlXbxtCY3gcH2JRZ0ZPSF1tbWVFGgZXXH4ZYmN2RXtXQGNQG05PY2R3FktXY1VNR1ITf2hCWXcDA0NMe2ZPSx0WXGICEVpybWJ7SnpyUGtDTRxzexRtfnIEA28ZfGR4HnxkZAJKHHF7YVp0eVdbVXVYGWJtfkt4REB4UH9FRXhuVV52dmNocUROZElAQkRUeVVhSBlIdWhsGglVdH5jT3xIe3R3CUJmcG8eY24Va3phc3BxcVJYeR9oQGpdQW98bEdtdEVXG2hZYh5Lam5CTx99Y2YYEH9PHntid2Zkc05sSU14RkJDVXZaQHFvcWRLQFtgcwEdRGxHRHl2an56VG5RHE1pWWt2ZmNqSUUbXU9VVnVqWkpNamxbZ055S0liZX4Rc2xiGHhHSEZ1UFlLSkRVYkkCe0N5bHBnSnUadmQDQlFPGX0Daml1YGt3bmRMbEgae3dyQmdEb2VPdElkdgFJV2BEbGxNQ3hmZlx0B38bHgd3a1d9UF5MG3t+bnd3amZ/a30dTnN5YxxuYVlmTn5seE5DdABVc1ZBc2JcZH5sQ2Bmdx0ebUxAQ0odaWtXbxwBSmlZZnh3f0BKG05dSmVCXXd5Vkx7e08UfEBHX1VcfhltbGZ3f0dIGmNwb3N/RBlLfXhrUXoZWhNraEYaVWlaWX5tbUtqaRYFVXdDSEhGSAJ/HQhrUW9zYE96XR91R3tcSm5aX0l6ZABRdmR9f2JqT057W0NpcEAbe35+SHhXWHNoYE5JTlRJGHddRXZ8fGx4aUN7SmhZRnt6e09US0NXQHdqRBF8XHZfS0d2eGYaZ29PHxRAd3d/Zkp+SU5JRR9LeAJeGntEcRp8RWVgZVxYYmwaeW50akAeUUYZYk57QXd6ZmNTbXsbHH4cWmZVdlViSBl+Tk9WHgVUAUtxeRodAk9qAQZgRUFBempdQXZcCGVOQhtsa0EfYnhaRmlzTWltekBmaXdqUBlPfkRUdER+emZGQkl8fhwdS2hFUU5rWnFNeBceVnNWQ2hBYWJObEcJd3VYHmJFXHh3bUhhV1BZHHpkf1p+dUVVSkVaQngeGkxkeUpMcXthYnx8F2RQShBLcBp9bHhCAWFgGhluSkFaeXxcVUNwbGRkSUBea2NadG1KGGlteHlpWmBZREVOR1RffHhyWWVAURp8R0JrTlxaek4ZQhJ4HRcZ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'