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代码实现
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=0for i in range(sss):for j in range(len(y[0])):arr[i,j]=x1[n]n+=1print("替换矩阵\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=0for j in sort_key(key):for i in range(sss):arr[i,j]=x[n]n+=1print(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_1if __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))passelif input_n=="0":print("!!!退出程序!!!")quit()else:print("!!!输入序号错误退出程序!!!")break
运行结果