一、代换密码
代换密码算法的原理是使用代换法进行加密,就是将明文中的字符用其他字符替代后形成密文。例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
1、加法密码(移位密码)
最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。它的加密过程可以表示为下面的函数:
其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。
2、乘法密码
乘法逆元的定义为:对a∈Zm,存在b∈Zm,使得a×b ≡1 (mod m),则称b为a的乘法逆元,其中Zm表示小于 m 的所有非负整数集合。
a存在模m的乘法逆元的充要条件是gcd(a, m)=1。
通常通过扩展欧几里得算法乘法逆元。
扩展欧几里得算法的具体描述如下:
Extended EUCLID(d,m)
(1) (X1,X2,X3)←(1,0,m);(Y1,Y2,Y3)←(1,0,d)。
(2) 若 Y3=0,返回 X3=gcd(d,m);无逆元。
(3) 若 Y3=1,返回 Y3=gcd(d,m);Y2=d-1mod m。
(4)Q = [X3 / Y3] 向下取整
(5) (T1,T2,T3)←(X1-QY1, X2 -QY2, X3-QY3)。
(6) (X1,X2,X3)←(Y1,Y2,Y3)。
(7) (Y1,Y2,Y3)←(T1,T2,T3)。
(8) 返回(2)。
乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下:
其中,m、c、k 是满足0 < m, k < 25,且 gcd(k,26)=1 的整数。
3、仿射密码
仿射密码的加密是一个线性变换,移位密码和乘法密码的结合,其加解密分别为:
其中:k1、k2 是密钥,是满足 0 < k1, k2<25 和 gcd(k1,26)=1 的整数。
具体实现代码:
加法如下
import tkinter as tk
all_char = "abcdefghijklmnopqrstuvwxyz"
# 加法加密与解密
def jiafa_jiami(char, key):
result = ""
for ch in char:
result += all_char[(ord(ch) - ord('a') + key) % 26]
return result
def jiafa_jiemi(char, key):
result = ""
for ch in char:
result += all_char[(ord(ch) - ord('a') - key) % 26]
return result
乘法如下
# 乘法加密解密
def mut_jiami(char, key):
result = ""
for ch in char:
result += all_char[(ord(ch) - ord("a")) * key % 26]
return result
def mut_jiemi(char, key):
result = ""
for ch in char:
result += all_char[(ord(ch) - ord("a")) * exgcd(key, 26)[0] % 26] # 取逆元的x值
return result
仿射如下
# 仿射加密解密
def exgcd(a, b): # 乘法逆元实现 a:key b:26字母
if b == 0:
x = 1
y = 0
return x, y
x1, y1 = exgcd(b, a % b)
x = y1
y = x1 - (a // b) * y1
return x, y
def fang_jiami(char, key1, key2):
result = ""
for ch in char:
result += all_char[((ord(ch) - ord("a")) * key1 + key2) % 26]
return result
def fang_jiemi(char, key1, key2):
result = ""
k1 = exgcd(key1, 26)[0]
k2 = key2
for ch in char:
result += all_char[((ord(ch) - ord("a") - k2) * k1) % 26]
return result