[GKCTF2020]小学生的密码学

# 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==}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值