def Generate_2D_array():
'''
生成二维数组
:return:
'''
array = [] #二维数组
line = []
for m in range(len(mw)):
line.append(mw[m])
if (m+1)%len(key)==0:
array.append(line)
line = []
if line!=[]:
array.append(line)
for e in array:
print(e)
return array
def Mapping_relation_table():
'''
根据密钥对应字母表的列序号
:return: 列序号
'''
sequence = []
num = 1
for p in key:
sequence.append(0) #创建一个全为0的数组,长度与密钥一致
zmb = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
for z in range(len(zmb)): #建立密钥与字母表的映射关系
for p in range(len(key)):
if key[p] == zmb[z]:
sequence[p] = num
num+=1
print(sequence)
return sequence
def encryption(array):
'''
加密算法
:param array:
:return: 密文
'''
sequence = Mapping_relation_table()
ciphertext = ''
ciphertext_map = {}
for s in range(len(sequence)): #根据列序号匹配二维数组的信息得到密文
text = ''
for i in array:
try:
text+=i[s]
except IndexError:
pass
ciphertext_map[sequence[s]] = text
ciphertext_map = sorted(ciphertext_map.items(),key=lambda kv:kv[0])
for c in ciphertext_map:
ciphertext+=c[1]
return ciphertext
def Decryption(ciphertext,sequence):
'''
解密算法 根据位置偏移解密 根据序列号乘以密钥长度,然后得到明文的位置,然后返回结果输出明文
:param ciphertext:
:param sequence:
:return: 明文
'''
c_length = len(ciphertext)
mtext = []
for i in range(c_length):
mtext.append(0)
count = 0
for m in range(len(mtext)):
n = m*len(sequence)
for s in sequence:
if n >= len(mw):
break
n_place = 0
for i in range(1,s):
n_place+=length_map[i]
mtext[n] = ciphertext[n_place+count]
n += 1
count+=1
Plaintext = ''.join(mtext)
return Plaintext
def len_dict(array):
'''
算二维数组行列长度
:param array:
:return: length_map
'''
length_map_ = {}
length_map = {}
cnt = 1
for e in range(len(array[0])):
for i in range(len(array)):
try:
if array[i][e]:
length_map_[e] = cnt
cnt += 1
except:
pass
l_map = length_map_.copy()
for l in length_map_.keys():
if l == 0:
pass
else:
length_map_[l] = length_map_[l] - l_map[l - 1]
for s, j in zip(sequence, list(length_map_.values())):
length_map[s] = j
return length_map
if __name__ == '__main__':
while True:
print('======易位加密解密系统=========')
print('========输入1加密============')
print('========输入2解密============')
print('=======输入其他退出程序========')
choice = input('')
if choice == '1':
key = input('输入一段密钥')
mw = input('请输入一段明文')
mw = mw.strip().replace(' ', '')
array = Generate_2D_array()
ciphertext = encryption(array)
print('加密后的内容是:', ciphertext)
elif choice == '2':
ciphertext = input('输入一段密文')
key = input('输入一段密钥')
sequence = Mapping_relation_table()
array = Generate_2D_array()
e_length = len(array)
length_map = len_dict(array)
Plaintext = Decryption(ciphertext, sequence)
print('解密后的明文为:', Plaintext)
else:
print('退出程序')
quit()