Crypto

仿射密码

仿射密码是是加法密码与乘法密码的结合。它一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。加密后字母的大小写不变的。

  • 加密函数:E(x) = (ax + b) (mod m),其中a与m互为质数,这也是能求a逆模的必要条件。
  • 解密函数:D(x) = a^-1(x - b)(mod m),其中 a^-1为a在Zm群的逆元。

当 a = 1时相当于凯撒密码, 其实整个密码就是凯撒密码那种意思,只是加强版吧。

对于求逆元可以直接使用python gmpy2库的 invert() 方法。

以GKCTF2020中第一道 Crypto 作为练手。

image-20200529175847900

  • 首先知道 a = 11,b = 6,m = 26。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import 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()

-------------本文结束感谢您的阅读-------------