# coding: utf-8
import base64
import gmpy2
'''
题目:
[GKCTF2020]小学生的密码学
e(x) = (11 * x + 6) % 26
密文:welcylk
flag为base64形式
'''
'''
仿射密码:
仿射密码是一种替换密码。
它是一个字母对应一个字母的。
它的加密函数是:
e(x) = (a*x+b) % n
其中,
a和n互质,n是明文用到的所有的字母的总数。
解密函数是:
d(x) = ((a^(-1))*(x-b)) % n
其中,(a^(-1))是a的乘法逆元。
在这道题中,
a = 11
b = 6
n = 26
先求a的乘法逆元:
'''
i_a_niyuan = gmpy2.invert(11, 26)
print('i_a_niyuan:', i_a_niyuan)
flag = ''
c = 'welcylk'
l = len(c)
for i in range(l):
i_tmp = (i_a_niyuan * (ord(c[i]) - 97 - 6)) % 26
flag += chr(i_tmp + 97)
print(flag)
byte_flag = flag.encode('utf-8')
byte_b64 = base64.b64encode(byte_flag)
print(byte_b64)
运行结果:
i_a_niyuan: 19
sorcery
b'c29yY2VyeQ=='
进程已结束,退出代码为 0
最后修改成:
flag{c29yY2VyeQ==}