传统加密技术——置换加密(Py2.7实现)

来源:互联网 发布:爆伤和黄字算法 编辑:程序博客网 时间:2024/06/06 08:53

传统加密技术——置换加密(Py2.7实现)

不同于将明文代替为密文字母,置换加密是一种对明文进行置换,这种密码为置换密码。

最简单的置换例子是栅栏技术,按照对角线的顺序写出明文,按行的顺序读出作为密文,例如深度为2的栅栏技术加密信息‘meet me after the toga party’可以加密为:
栅栏技术
加密后的信息为:MEMATRHTGPRYETEFETEOAAT

更复杂一个方案就是把消息一行一行的写成矩形块,然后按列读出,但是把列的读出次序打乱(明文本身不变),列的次序就是算法的密钥。如:
列变换

要是想要密文更难被分析,可以将密文在进行一次相同方式的列变换,二次变换后的密文更无规律性,从而更安全。

以下就是用Py2.7实现的置换算法的代码,有详细的注释,就不多解释了。

# -*- coding: utf-8 -*-"""Created on Mon Sep 25 20:16:46 2017@author: liang"""import numpy as np#判断输入是否合法的函数def is_legal_input(txt,m,n,key):    if m*n<len(txt) or len(key)!=n:        return False    else:        return True#索引变换函数,将秘钥转换为输出/插入的索引列def index_exchange(n):    output_index=range(0,n)    for i in range(0,n): #将密钥与输出序列相对应        for j in range(0,n):            if(key[j]>key[i]):                key[j],key[i]=key[i],key[j]                output_index[j],output_index[i]=output_index[i],output_index[j]    print output_index     return output_index#加密返回密文def encryption(txt,m,n,key):#txt为明文,m行n列的转化矩阵,key为加密秘钥    arr=np.empty((m,n),dtype=np.character)    #1.分离    index=0    for i in range(0,m):        for j in range(0,n):            if index<len(txt):                arr[i,j]=txt[index]                index+=1            else:                print 'depart complete'    print arr    #2.转换    output_index=index_exchange(n)    #3.输出    ciphertext=[]    for i in output_index:        print arr[:,i]        for j in range(0,4):            ciphertext.append(arr[j,i])    #密文    return ciphertext#解密并返回def decode(txt,m,n,key):    arr=np.zeros((m,n),dtype=np.character)    output_index=index_exchange(n)    #将密文插入    index=0    for insert_index in output_index:        for i in range(0,m):            arr[i,insert_index]=txt[index]            index+=1    return arr#测试方法plaintext='attackpostponeduntiltwoamxyz'key=[4,3,1,2,5,6,7]#秘钥if is_legal_input(plaintext,4,7,key)==True:    #二次加密    s=encryption(plaintext,4,7,key)    key=[4,3,1,2,5,6,7]    s2=encryption(s,4,7,key)    #解密    key=[4,3,1,2,5,6,7]#秘钥    arr_plain=decode(s,4,7,key)    #二次解密    key=[4,3,1,2,5,6,7]    arr_plain_01=decode(s2,4,7,key)    #将第一次解密的信息转化为字符串形式    arr_plain_temp=[]    for i in range(0,4):        for j in range(0,7):            arr_plain_temp.append(arr_plain_01[i][j])    key=[4,3,1,2,5,6,7]    arr_plain_02=decode(arr_plain_temp,4,7,key)    print s,s2,arr_plain,arr_plain_01,arr_plain_02

以上方法只是置换算法的简单实现,仅供参考。