仿射密码
仿射密码是是加法密码与乘法密码的结合。它一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。加密后字母的大小写不变的。
- 加密函数:E(x) = (ax + b) (mod m),其中a与m互为质数,这也是能求a逆模的必要条件。
- 解密函数:D(x) = a^-1(x - b)(mod m),其中 a^-1为a在Zm群的逆元。
当 a = 1时相当于凯撒密码, 其实整个密码就是凯撒密码那种意思,只是加强版吧。
以GKCTF2020中第一道 Crypto 作为练手。
首先知道 a = 11,b = 6,m = 26。
1
2
3
4
5
6
7
8
9
10import gmpy2
import base64
flag = ""
for i in "welcylk":
flag += chr(((ord(i)-97)-6)*gmpy2.invert(11, 26)%26 + 97)
flag = bytes(flag, encoding = "utf-8") #将str转化为byte类型。
flag = base64.b64encode(flag) #这里只能使用byte类型。
print (flag)python中str与byte区别:
Python3严格区分文本(str)和二进制数据(Bytes),文本总是Unicode,用str类型,二进制数据则用Bytes类型表示。
str -> byte:
s = bytes(s, encoding = “utf-8”)
s = s.encode()
s = s.encode(encoding = “utf-8”)
byte -> str:
s = str(s, encoding = “utf-8”)
s = bytes.decode(s)
s = s.decode()