维吉尼亚密码 php,python小脚本之维吉尼亚密码

维吉尼亚作为古典密码,本身的加解密并不是很难,因此也就有了这篇文章~

维吉尼亚密码 php,python小脚本之维吉尼亚密码_第1张图片

下面初步解释下维吉尼亚密码的加密原理,假设现在有明文‘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()

你可能感兴趣的:(维吉尼亚密码,php)