python密码表_维吉尼亚密码的Python实现

代换密码体制的一般定义为M=C=K=Z26,其中M为明文空间、C为密文空间、K为密钥空间、Z26为26个整数(对应26个英文字母)组成的空间;要求26个字母与模26的剩余类集合{0,1,2,…,25}建立一一对应的关系。

1、移位密码

移位密码的加密实现上就是将26个英文字母向后循环移动k位,其加解密可分别表示为:

c=Ek(m)=m+k(mod 26)

m=Dk(c)=c-k(mod 26)

其中,m、c、k是满足0≤m,c,k≤25的整数。

2、维吉尼亚密码

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)

通常通过查询维吉尼亚表进行加解密。

以下为维吉尼亚密码的Python实现。

1 #-*-coding:utf-8-*-

2 #维吉尼亚

3

4 '''

5 fileName : main.py6 '''

7

8 importVigenereEncrypto9 importVigenereDecrypto10

11 print u"维吉尼亚加密"

12

13 plainText = raw_input ("Please input the plainText :")14 key = raw_input ("Please input the key :")15

16 plainTextToCipherText =VigenereEncrypto (plainText , key)17 print u"加密后得到的暗文是 :" +plainTextToCipherText18

19 print u"维吉尼亚解密"

20

21 cipherText = raw_input ("Please input the cipherText :")22 key = raw_input ("Please input the key :")23

24 cipherTextToPlainText =VigenereDecrypto (cipherText , key)25 print u"解密后得到的明文是 :" + cipherTextToPlainText

1 #-*-coding:utf-8-*-

2 #维吉尼亚加密

3

4 '''

5 fileName : VigenereEncrypto.py6 '''

7

8 defVigenereEncrypto (input , key) :9 ptLen =len(input)10 keyLen =len(key)11

12 quotient = ptLen // keyLen #商

13 remainder = ptLen % keyLen #余

14

15 out = ""

16

17 for i inrange (0 , quotient) :18 for j inrange (0 , keyLen) :19 c = int((ord(input[i*keyLen+j]) - ord('a') + ord(key[j]) - ord('a')) % 26 + ord('a'))20 #global output

21 out +=chr (c)22

23 for i inrange (0 , remainder) :24 c = int((ord(input[quotient*keyLen+i]) - ord('a') + ord(key[i]) - ord('a')) % 26 + ord('a'))25 #global output

26 out +=chr (c)27

28 return out

1 #-*-coding:utf-8-*-

2 #维吉尼亚解密

3

4 '''

5 fileName : VigenereDecrypto.py6 '''

7

8 defVigenereDecrypto (output , key) :9 ptLen =len (output)10 keyLen =len (key)11

12 quotien = ptLen //keyLen13 remainder = ptLen %keyLen14

15 inp = ""

16

17 for i inrange (0 , quotient) :18 for j inrange (0 , keyLen) :19 c = int((ord(output[i*keyLen+j]) - ord('a') + 26 - (ord(key[j]) - ord('a')) % 26 + ord('a')))20 #global input

21 inp +=chr (c)22

23 for i inrange (0 , remainder) :24 c = int((ord(output[quotient*keyLen + i]) - ord('a') + 26 - (ord(key[i]) - ord('a')) % 26 + ord('a')))25 #global input

26 inp +=chr (c)27

28 return inp

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值