马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 ~风介~ 于 2015-1-12 21:57 编辑 def create_letter_list(miyao):#补全25个字母
l = []
l += miyao.upper()#把输入的密钥变为大写
for i in range(97,122):
if chr(i).upper() not in miyao.upper():#把A到Y中不在密钥中的字母补全进去
l.append(chr(i).upper())
l.reverse()#逆置生成的字母表
l1 = [] #以下把字母表分割成二维数组
l2 = []
i = 0
while i < 25 :
l1 += l.pop()
i = i + 1
if i % 5 == 0:
l2.extend([l1])
l1 = []
print('生成的矩阵是:')
for i in range(len(l2)):#输出矩阵
print(l2[i])
return l2
def creat_plaintext():#生成明文
l1 = list(input('请输入明文<位数必须是偶数>:'))#接受输入
l2 = []
for i in range(len(l1)):#把明文中的小写变为大写
if ord(l1[i]) >= 97:
l1[i] = l1[i].upper()
l2.append(l1[i])
return l2
def dingwei(x):#定位明文在矩阵中的坐标
l1 = []
for i in range(len(x)):
for j in range(5):
for k in range(5):
if letter_list[j][k] == x[i]:
l1.append([j,k])
return l1
def jiami():#加密函数
l2 = []
y = dingwei(plaintext)
i = 0
while i < (len(y)-1):
j = i + 1
if y[i][0] == y[j][0]:#如果在同一行
y[i][1] = (y[i][1] + 1)%5
y[j][1] = (y[j][1] + 1)%5
elif y[i][1] == y[j][1]:#如果在同一列
y[i][0] = (y[i][0] + 1)%5
y[j][0] = (y[j][0] + 1)%5
else:
temp = y[i][1]
y[i][1] = y[j][1]
y[j][1] = temp
l2.append(y[i])
l2.append(y[j])
i += 2
print('加密后的密文是: ',end='')
printout(l2)#输出函数
return l2
def jiemi(x):#解密函数
l3 = []
l5 = []
for i in range(len(x)):#接收加密后的密文
l5.append(letter_list[x[i][0]][x[i][1]])
y = dingwei(l5)
i = 0
while i < (len(y)-1):
j = i + 1
if y[i][0] == y[j][0]:#如果在同一行
y[i][1] = (y[i][1] - 1 + 5 )%5
y[j][1] = (y[j][1] - 1 + 5 )%5
elif y[i][1] == y[j][1]:#如果在同一列
y[i][0] = (y[i][0] - 1 + 5)%5
y[j][0] = (y[j][0] - 1 + 5)%5
else:
temp = y[i][1]
y[i][1] = y[j][1]
y[j][1] = temp
l3.append(y[i])
l3.append(y[j])
i += 2
print('解密后的明文是: ',end='')
printout(l3)#输出
def printout(z):#输出函数
l4 = []
for i in range(len(z)):
l4.append(letter_list[z[i][0]][z[i][1]])
print(l4)
#主函数
letter_list = create_letter_list(input('请输密钥:'))
plaintext = creat_plaintext()
print('处理前的明文是:',plaintext)
jiemi(jiami())
截图如下:
P.S.完整版后继补充~先去睡觉了~
|