BUUCTF-Crypto【21-40T】loading……

21.[GKCTF2020]小学生的密码学

e(x)=11x+6(mod26)

密文:welcylk

(flag为base64形式)

BUUCTF-Crypto【21-40T】loading……

  1.  这种形式的加密手法是仿射变换其加解密分别如上
  2. 所以可以得到a=11,b=6,需要做的工作是根据密文c,密钥a/b求得明文m。这里a−1计算可以利用Python的gmpy2库中invert函数完成
  3. 注意仿射变换26个字母按数字0~25记,因此在需要将密文ASCII对应的数值减去97,解密完恢复成字母即加上97
  4. 此外,题目要求最后的flag为base64形式,因此还需借助Python的base64库中b64encode函数。需要注意的是在Python3中,字符都为unicode编码,而b64encode函数的参数为byte类型,所以必须先转码。
  5. 解题代码如下
from gmpy2 import invert
from base64 import b64encode

c = "welcylk"
a = 11
b = 6
n = 26

in_a = invert(a, n)
print(in_a)
# in_a = 19

m = []
for i in c:
    modified_c = ord(i)-97
    m.append((modified_c-b)*in_a % 26)
flag = ""
for mi in m:
    flag += chr(mi+97)
print(b64encode(flag.encode()))

flag{c29yY2VyeQ==}

参考:https://www.cnblogs.com/vict0r/p/13791142.html

上一篇:Jmeter-循环控制器+事务控制器,实现循环读取csv文件中的参数


下一篇:437. Path Sum III