维吉尼亚作为古典密码,本身的加解密并不是很难,因此也就有了这篇文章~
下面初步解释下维吉尼亚密码的加密原理,假设现在有明文‘a’,加密密钥为‘b’,然后我们参照上面的维吉尼亚密码表进行加密,在a行的b列即为我们加密过后的密文,在这里我们的密文即为‘b’。同理,现在加入我们有密文和密钥,需要我们进行解密,同样我们假设密文为‘g’,加密密钥为‘d’,那么我们可以在表中的d列寻找‘g’,我们可以看到d行的d列即为‘g’,当然这里行数与列数相同纯属巧合,总的来说我们还是需要借助这个表来进行解密。
同时给出的密钥不一定与密文的长度相等,这时候我们就需要给密钥进行循环补位,假设密钥为‘abc’,密文长度为10,那么我们密钥也应该补位为10位,补位后的密钥为‘abcabcabca’。
在进行维吉尼亚密码加密时,我们可以总结规律:密钥虽然为字母,但是我们可以计算其在字母表中的顺位,同时如果给明文加密,总是以明文为第一位,这里就跟凯撒密码一样,以明文为基准,密钥的顺位作为偏移量,从而可以计算出密文。
下面附上维吉尼亚密码加密的源程序(环境python2.7):
维吉尼亚密码
#-*-coding:utf-*-
import string
crypto='BLOCKCIPHERDESIGNPRINCIPLE'
crypto=crypto.lower()
#print crypto
#这里的crypto为明文,不为密文!
password='COMPUTER'
pwd=''
num1=len(crypto)
num2=len(password)
for i in range(num1/num2):
pwd+=password
pwd+=password[:num1%num2]
pwd=pwd.lower()
#print pwd
#给密钥循环补位
final=''
for i in range(len(pwd)):
num=ord(pwd[i])-ord('a')
#计算偏移量
num=ord(crypto[i])+num
#得到加密后的ascii码值
if num>122:
num-=26
#检查是否超过‘z’
final+=chr(num)
print final.upper()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#-*-coding:utf-*-
importstring
crypto='BLOCKCIPHERDESIGNPRINCIPLE'
crypto=crypto.lower()
#print crypto
#这里的crypto为明文,不为密文!
password='COMPUTER'
pwd=''
num1=len(crypto)
num2=len(password)
foriinrange(num1/num2):
pwd+=password
pwd+=password[:num1%num2]
pwd=pwd.lower()
#print pwd
#给密钥循环补位
final=''
foriinrange(len(pwd)):
num=ord(pwd[i])-ord('a')
#计算偏移量
num=ord(crypto[i])+num
#得到加密后的ascii码值
ifnum>122:
num-=26
#检查是否超过‘z’
final+=chr(num)
printfinal.upper()