想了一下,还是发出来吧。这是我们这学期的第一次密码学作业,要求用古典密码组合出一个加密算法,如果这对你来说也是作业,请记得修改。
# 置换密码加密
def shift_encrypt(m, key):
l = len(key)
c = ""
for i in range(0, len(m), l):
tmp_c = [""] * l
if i+l > len(m):
tmp_m = m[i:]
else:
tmp_m = m[i:i+l]
for j in range(len(tmp_m)):
tmp_c[int(key[j]) - 1] = tmp_m[j]
c += "".join(tmp_c)
return c
# 置换密码解密
def shift_decrypt(c, key):
l = len(key)
m = ""
for i in range(0, len(c), l):
tmp_m = [""] * l
if i+l >= len(c):
tmp_c = c[i:]
re_key = []
for j in range(len(tmp_c)):
re_key.append(int(key[j])-1)
re_key.sort()
for j in range(len(tmp_c)):
tmp_m[j] = tmp_c[re_key.index(int(key[j])-1)]
else:
tmp_c = c[i:i+l]
for j in range(len(tmp_c)):
tmp_m[j] = tmp_c[int(key[j]) - 1]
m += "".join(tmp_m)
return m
# 仿射密码加密
def affine_encrypt(m, key):
tmp = []
c = ''
for i in m:
# 将字符转为ASCII码然后进行仿射加密,加密结果再mod26
i = ((ord(i)-97)*key[0] + key[1]) % 26
j = chr(i+97) # 再将ASCII码转回字符
tmp.append(j)
for i in tmp:
c = c + i
return c
# 仿射密码解密
def ex_gcd(a, b, arr): # 扩展欧几里得求公约数
if b == 0:
arr[0] = 1
arr[1] = 0
return a
g = ex_gcd(b, a%b, arr)
t = arr[0]
arr[0] = arr[1]
arr[1] = t - int(a/b) * arr[1]
return g
def mod_reverse(a, n): # ax=1(mod n) 求a模n的乘法逆x
arr = [0,1]
gcd = ex_gcd(a,n,arr)
if gcd == 1:
return (arr[0] % n + n) % n
else:
return -1
def affine_decrypt(c, key):
tmp = []
m = ''
inverse = mod_reverse(key[0], 26) # 逆元
for i in c:
i = (inverse * ((ord(i)-97)-key[1])) % 26
j = chr(i+97)
tmp.append(j)
for i in tmp:
m = m + i
return m
# 最终加密
m = input("请输入待加密的字符串:")
key1 = '3142' # 置换密码的密钥 ABCD ---> BDAC
key2 = [11,5] # 仿射密码的密钥
c1 = shift_encrypt(m, key1)
c2 = shift_encrypt(c1, key1)
c3 = affine_encrypt(c2, key2)
print("加密结果为:", c3)
# 最终解密
c = input("请输入待解密的字符串:")
m1 = affine_decrypt(c, key2)
m2 = shift_decrypt(m1, key1)
m3 = shift_decrypt(m2, key1)
print("解密结果为:", m3)