记录一下刷题&比赛中遇到的一些古典密码题
最近更新: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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'