1、曲路密码
脚本
# 曲路密码
import re
def encrypt_bend(string, col, row=10):
ciphertext = ""
temp = []
for i in range(col):
temp.append([])
for index, i in enumerate(string):
temp[index % col].append(i)
re_temp = list(reversed(temp))
for index, i in enumerate(re_temp):
if index % 2 == 0:
i = list(reversed(i))
ciphertext += "".join(i)
return ciphertext
def decrypt_bend(string, col, row=10):
plaintext = ""
length = len(string)
min_row = length // col # 最小的行数
min_num = col - length % col # 最小行数的列数
# 分组
temp = []
index = 0
for i in range(col):
if i < min_num:
temp.append(string[index:index+min_row])
index += min_row
else:
temp.append(string[index:index+min_row+1])
index += min_row + 1
print(temp)
# 改回列顺序
for index, i in enumerate(temp):
if index % 2 == 0:
# print(re.findall(".{1}", temp[index]))
temp[index] = "".join(list(reversed(re.findall(".{1}", temp[index]))))
temp.reverse()
for i in range(length):
plaintext += temp[i % col][i // col]
return plaintext
if __name__ == '__main__':
col_ = 7
row_ = 5
ciphertext_ = encrypt_bend("i will beat you this day", col_, row_)
plaintext_ = decrypt_bend(ciphertext_, col_, row_)
print(f"{plaintext_} : {ciphertext_}")
2、仿射密码(Affine Cipher)
原理
仿射密码(Affine Cipher)是一种单表代换密码,字母表中的每个字母相应的值使用一个简单的数学函数映射到对应的数值,再把对应数值转换成字母。这个公式意味着每个字母加密都会返回一个相同的字母,意义着这种加密方式本质上是一种标准替代密码。因此,它具有所有替代密码的弱点。
加密函数:E(x)=(ax+b)(mod m)
a与b互质,a与m互质
m是编码系统中字符的数量(一般是26或者52)
解密函数:D(x) =a^-1(x-b)(mod m),其中a-1是a在Zm群的乘法逆元。
乘法逆元:
如果存在a,x,b满足线性同余方程ax ≡ 1(mod b)(即b除以整数ax − 1,或者换句话说,将ax除以整数b之后的余数为1),则我们称:
a关于模b的乘法逆元为x,表示为a ≡ x^-1 (mod b);
x关于模b的乘法逆元为a,表示为x ≡ a^-1 (mod b)
简单来说,求a的逆,就是找一个x,使得1 =(a∗x)(mod n)
也可记作 a^− 1 ≡ x(mod n)
这里所求的逆元a^-1 = gmpy2.invert(a,m)
加密脚本
c = []
a=
b=
def enc(plaintxt):
for i in plaintxt:
if i.islower():
temp = ((ord(i) - 97) * a + b) % 26 + 97
c.append(chr(temp))
elif i.isupper():
temp = ((ord(i) - 65) * a + b) % 26 + 65
c.append(chr(temp))
else:
c.append(i)
遍历求a的逆元
# 遍历得到a的乘法逆元
def get_are(a):
for i in range(1, 27):
if a * i % 26 == 1:
return i
解密脚本
import gmpy2
a=
b=
niyuan = gmpy2.invert(a,26)
p=[]
def dec(cipher):
for i in cipher:
if i.islower():
temp = (((ord(i) - 97) - b) * niyuan) % 26 + 97
p.append(chr(temp))
elif i.isupper():
temp = (((ord(i) - 65) - b) * niyuan) % 26 + 65
p.append(chr(temp))
else:
p.append(i)
3、Alien’s_secret
https://uazu.net/notes/alien.html#s2
4.怪异密码
5.宇宙终极问题
#(-80538738812075974)³+80435758145817515³+12602123297335631³=42
x=80538738812075974
y=80435758145817515
z=12602123297335631
6.Hill(希尔密码)
UTCTF 2020 Hill
s='wznqcaduqopfkqnwofDbzgeu'
flag_pre='utflag'
def getit(a1,b1,c1,a2,b2,c2,a3,b3,c3):
for i in range(26):
for j in range(26):
if (a1 * i + b1 * j) % 26 == c1 and (a2 * i + b2 * j) % 26 == c2 and (a3 * i+b3*j) % 26 == c3:
return (i,j)
x1=getit(22,25,20,13,16,5,2,0,0)
x2=getit(22,25,19,13,16,11,2,0,6)
import string
flag=''
for i in range(0, len(s),2):
flag+=string.ascii_letters[(x1[0]*string.ascii_letters.index(s[i])+x1[1]*string.ascii_letters.index(s[i+1]))%26]
flag+=string.ascii_letters[(x2[0]*string.ascii_letters.index(s[i])+x2[1]*string.ascii_letters.index(s[i+1]))%26]
print(flag)
#utflagdngeruscphertextqq