CaesarCerydra


Crypto - CaesarCerydra Writeup

解密脚本

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
39
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True

def main():
primes = []
for num in range(2048, 4096):
if is_prime(num):
primes.append(num)
ciphertext = "GXAKMS{34hE_djwwvk_UfGJkw_WFU_LUs_RWF8sn_Kp0rWI}"
base = 14
for r in primes:
plaintext = []
for i, c in enumerate(ciphertext):
term1 = base
term2 = (i + 1) * r
term3 = i * (i + 1) * (2 * i + 1) // 6
offset_mod26 = (term1 + term2 + term3) % 26

if 'A' <= c <= 'Z':
dec_char = chr((ord(c) - ord('A') - offset_mod26) % 26 + ord('A'))
plaintext.append(dec_char)
elif 'a' <= c <= 'z':
dec_char = chr((ord(c) - ord('a') - offset_mod26) % 26 + ord('a'))
plaintext.append(dec_char)
else:
plaintext.append(c)

plaintext_str = ''.join(plaintext)
if plaintext_str.startswith("XSWCTF{") in plaintext_str:
print(f"r = {r} -> {plaintext_str}")
break

if __name__ == '__main__':
main()

注:base=14是因为base = 33550336 % 26 = 14

感谢出题人审阅 辛苦了


文章作者: 企鹅主人
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 企鹅主人 !
  目录