- 正好利用完成作业的时间将VigenereCode看了一下,下面就讲解一下我自己所学到的东西吧。
1. 密码简介
Vigenenre密码是最著名的多表代换密码,是16世纪法国著名密码学家Vigenenre发明的。Vigenenre密码使用一个词组作为密钥,密钥中每一个字母用来确定一个代换表,每一个密钥字母被用来加密一个明文字母,第一个密钥字母加密第一个明文字母,第二个密钥字母加密第二个明文字母,等所有密钥字母使用完后,密钥再次循环使用,于是加解密前需先将明密文按照密钥长度进行分组。密码算法可表示如下:
设密钥K=(k1,k2,…,kd),明文M=(m1,m2,…,mn),密文C=(c1,c2,…,cn);
加密变换为:ci=Eki(mi)=mi+ki(mod 26)
解密变换为:mi=Dki(ci)=ci-ki(mod 26)
通常通过查询维吉尼亚表进行加解密。
明文:ATTACKATDAWN
密钥:LEMONLEMONLE
密文:LXFOPVEFRNHR
#!/usr/bin/python2
# -*- coding:utf-8 -*-
# 文件名:encode.py明文:ATTACKATDAWN 密钥:LEMONLEMONLE 密文:LXFOPVEFRNHR
string = raw_input("Plaintext:")
code = raw_input("code:")
sL=len(string)
sC=len(code)
def encode():
result=''
for i in range (0,sL):
if ord(string[i])+ord(code[i%sC])-65<90:
result+=chr(ord(string[i])+ord(code[i%sC])-65)
else:
result+=chr((ord(string[i])+ord(code[i%sC])-65)%91+65)
return result
print encode()
2 密码破译
在一般知道密钥情况我就不说了直接写没有密钥的情况下怎么破解维吉尼亚加密
- 找到密钥长度
def findKeyLen(codeText):#寻找密钥长度
length = 0
maxCount = 0
for step in range(1,11):#假定密钥长度在1到10之间
count = 0
for i in range(0,len(codeText)-2*step):
for j in range(0,2):
if codeText[i+j] == codeText[i+step+j]:#两个一组进行匹配
count += 1
print(count)
if count>maxCount: #寻找并记录最大值
maxCount = count
length = step