Writeup 4 CSS CTF Semester 2 2026 Cryptography Chrono I题目信息题目名称Chrono I分值25难度Beginner题目描述We have intercepted a message and a Ciphertext, please help us crack the Ciphertext!Message:2026/09/21 14:35:07 - As always, The time is always the key to unlock itCiphertext:ESUITO{gwfvb_xejqnf_nimgt_b_whhrlv}Flag Format:CSSCTF{...}前置知识维吉尼亚密码Vigenère Cipher1. 什么是维吉尼亚密码维吉尼亚密码是一种多表替换密码由法国外交官布莱斯·德·维吉尼亚Blaise de Vigenère在 16 世纪提出。它是对凯撒密码的扩展——凯撒密码所有字母用同一个偏移量而维吉尼亚密码每个字母使用不同的偏移量偏移量由密钥决定。由于同一字母在不同位置会被加密成不同密文维吉尼亚密码在历史上曾被称为“不可破解的密码”le chiffre indéchiffrable直到 19 世纪才被弗里德里希·卡西斯基Friedrich Kasiski和查尔斯·巴贝奇Charles Babbage分别破解。2. 工作原理核心思想用密钥的每一位对明文的每一个字母进行凯撒移位。加密公式C_i (P_i K_i) mod 26解密公式P_i (C_i - K_i) mod 26其中P_i是第 i 个明文字母的数值A0, B1, …, Z25K_i是第 i 个密钥字母或数字的值C_i是第 i 个密文字母的数值密钥循环使用如果密钥比明文短密钥会从头开始重复使用。3. 举例说明假设明文HELLO密钥KEY步骤 1将字母转成数字A0, B1, …, Z25明文HELLO数值74111114密钥KEYKE数值10424104步骤 2逐位相加取模 26位置明文密钥计算密文1710(710) mod 26 17R244(44) mod 26 8I31124(1124) mod 26 35 mod 26 9J41110(1110) mod 26 21V5144(144) mod 26 18S密文RIJVS解密就是反过来P_i (C_i - K_i) mod 264. 数字作为密钥维吉尼亚密码的密钥不一定是字母也可以是数字。当密钥是数字时直接把数字当作偏移量密钥数字0→ 不偏移密钥数字1→ 偏移 1密钥数字9→ 偏移 9例如密钥202609明文字母按 2、0、2、6、0、9 的偏移量循环加密。5. 关键规则在实际应用中维吉尼亚密码有几个重要规则只加密字母数字、标点、空格等非字母字符通常原样保留不参与加密。密钥索引只对字母递增遇到非字母字符时密钥索引不前进。这意味着密钥只为字母消耗。大小写敏感大写字母加密后仍为大写小写字母加密后仍为小写。循环使用密钥用完一遍后从头开始直到所有字母加密完毕。6. 破解方法维吉尼亚密码的破解思路确定密钥长度利用卡西斯基测试Kasiski Examination或弗里德曼测试Friedman Test找出密钥长度。分组分析将密文按密钥长度分组每组实际上是凯撒密码。频率分析对每组进行频率分析确定每个位置的偏移量。还原密钥将所有偏移量拼起来得到密钥。但在 CTF 题目中密钥通常是已知的如本题的时间只需直接解密即可。解题思路1. 分析题目提示题目给出了两条关键信息一条消息2026/09/21 14:35:07 - As always, The time is always the key to unlock it一段密文ESUITO{gwfvb_xejqnf_nimgt_b_whhrlv}提示“The time is always the key to unlock it”非常明确地告诉我们时间就是密钥。结合密文格式ESUITO{...}可以猜测明文格式应为CSSCTF{...}即密文是通过某种古典密码加密得到的。2. 确定加密算法密文ESUITO对应明文CSSCTF我们逐字符分析偏移密文明文偏移密文 - 明文E (4)C (2)2S (18)S (18)0U (20)S (18)2I (8)C (2)6T (19)T (19)0O (14)F (5)9偏移序列为2, 0, 2, 6, 0, 9这个序列正好是时间2026/09/21 14:35:07的前 6 位数字202609。继续验证密钥的完整长度时间数字提取2026 09 21 14 35 07→20260921143507共 14 位这是一个典型的维吉尼亚密码特征密钥循环使用每个字母按密钥数字偏移。3. 维吉尼亚密码解密维吉尼亚密码规则回顾加密C (P K) mod 26解密P (C - K) mod 26其中K是密钥数字0-9只对字母生效非字母如{、_、}跳过。关键点密钥索引只对字母递增遇到非字母时不消耗密钥位。密钥20260921143507解密过程字母序号密文密钥计算明文0E (4)24-22C1S (18)018-018S2U (20)220-218S3I (8)68-62C4T (19)019-019T5O (14)914-95F-{-跳过{6g (6)26-24e7w (22)122-121v8f (5)15-14e9v (21)421-417r10b (1)31-3-2→24y-_-跳过_11x (23)523-518s12e (4)04-04e13j (9)79-72c14q (16)216-214o15n (13)013-013n16f (5)25-23d-_-跳过_17n (13)613-67h18i (8)08-08i19m (12)912-93d20g (6)26-24e21t (19)119-118s-_-跳过_22b (1)11-10a-_-跳过_23w (22)422-418s24h (7)37-34e25h (7)57-52c26r (17)017-017r27l (11)711-74e28v (21)221-219t得到明文CSSCTF{every_second_hides_a_secret}解题脚本defdecrypt_vigenere(ciphertext,key): 维吉尼亚密码解密 ciphertext: 密文 key: 密钥数字字符串 plaintext[]key_idx0forchinciphertext:ifch.isalpha():shiftint(key[key_idx%len(key)])baseord(A)ifch.isupper()elseord(a)plain_chchr((ord(ch)-base-shift)%26base)plaintext.append(plain_ch)key_idx1else:plaintext.append(ch)return.join(plaintext)ciphertextESUITO{gwfvb_xejqnf_nimgt_b_whhrlv}key20260921143507flagdecrypt_vigenere(ciphertext,key)print(flag)# 输出: CSSCTF{every_second_hides_a_secret}运行结果C:\Users\Administrator\AppData\Local\Programs\Python\Python314\python.exe exp.py CSSCTF{every_second_hides_a_secret}进程已结束退出代码为0关键坑点密钥索引只对字母递增遇到{、_、}等非字母字符时密钥索引不前进否则会导致后续字母解密错位。这是本题最容易出错的地方。密钥长度完整时间数字是2026092114350714 位不是前 6 位202609。大小写敏感解密时保持大小写题目要求 flag 大小写敏感。维吉尼亚密码的非字母处理标准维吉尼亚密码只加密字母非字母原样保留这是实现时需要注意的细节。最终 FlagCSSCTF{every_second_hides_a_secret}总结这是一道典型的维吉尼亚密码入门题考察点在于识别密码类型通过提示“时间就是密钥”和密文格式判断是维吉尼亚密码。提取密钥从时间格式中提取数字作为密钥。正确处理密钥循环密钥索引只对字母递增非字母跳过这是最容易出错的地方。维吉尼亚密码的基本原理多表替换、密钥循环、字母移位。经验遇到维吉尼亚密码时密钥索引只对字母递增非字母跳过这是实现和解题时最关键的一点。此外密钥不一定是字母数字也可以作为偏移量使用这在 CTF 题目中很常见。Rambo2026年国庆节
阅读完成 · 觉得有帮助?