1.置换密码
置换密码(Permutation Cipher)又叫换位密码(Transposi-tionCipher),它根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的所有字符不变,只是利用置换打乱了明文字符的位置和次序。
最常见的置换密码有两种:
1.列置换密码(明文P遵照密钥的规程按列换位并且按列读出序列得到密文C);
2.周期置换密码(将明文P按固定长度m分组,然后对每组按1,2…,m的某个置换重排位置从而得到密文C)。
2.列置换
2.1加密过程
将明文P以设定的固定分组宽度m按行写出,即每行有m个字符。若明文长度不是m的整数倍,则不足部分用双方约定的方式填充,如双方约定用空格代替空缺处字符,不妨设最后得字符矩阵;
按1,2…,m的某一置换交换列的位置次序得字符矩阵;
把矩阵按列1,2…,n的顺序依次读出得密文序列C。
3.加密解密程序流程图
4.python代码实现
import math
import random
import numpy as np
import copy
## 随机密钥生成
def keys():
d=[s for s in range(10) ]
number=random.randint(3, 8)
keys=[]
for i in range(number):
s=random.choice(d)
keys.append(s)
d.remove(s)
print("密钥:\n",keys)
keys_n=[]
for k in sorted(keys):
keys_n.append(keys.index(k))
return keys,keys_n
## 行置换矩阵生成
def arrs(x,y,):### x为内容,为密钥
sss=math.ceil(len(x)/len(y[0]))
x1=x+["0" for i in range(((sss*len(y[0]))-len(x)))]
arr = np.zeros((sss,len(y[0]))).astype('str')
n=0
for i in range(sss):
for j in range(len(y[0])):
arr[i,j]=x1[n]
n+=1
print("替换矩阵\n",arr)
mi=''
for j in y[1]:
for i in range(sss):
mi+=arr[i,j]
print("加密密文\n",mi)
#return arr
#nnnn=keys()
#print(nnnn[1])
#sss=input("hhhhh")
#print(arrs(sss,nnnn,))
### 解密函数
def jm(x,key):
sss=int(len(x)/len(key))
arr = np.zeros((sss,len(key))).astype('str')
n=0
for j in sort_key(key):
for i in range(sss):
arr[i,j]=x[n]
n+=1
print(arr)
mi=''
for i in range(sss):
for j in range(len(key)):
mi+=arr[i,j]
mi_1=mi.replace("0",'')
print("解密明文:\n",mi_1.lower())
def sort_key(x):
key_sort=[]
for k in sorted(x):
key_sort.append(x.index(k))
return key_sort
def list_key(key):
list_1=[]
for i in key:
list_1.append(i)
return list_1
if __name__=="__main__":
while True:
print('''********************欢迎进入加密解密程序*************************
1.明文加密
2.密文解密
0.退出程序
''')
input_n=input("请输入序号:")
if input_n=="1":
nnnn=keys()
sss=input("请输入明文:")
arrs(list(sss.upper()),nnnn)
elif input_n=="2":
mi_wen=input("请输入密文:")
mi_keys=input("请输入密钥:")
jm(list(mi_wen.upper()),list_key(mi_keys))
pass
elif input_n=="0":
print("!!!退出程序!!!")
quit()
else:
print("!!!输入序号错误退出程序!!!")
break
运行结果