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

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

c24fd5b0e7f5d6ca73c06ce82830c1cc.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值