python实现维吉尼亚算法

时间:2022-11-09 08:30:04

本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下

1 virginia加密算法、解密算法

vigenenre密码是最著名的多表代换密码,是法国著名密码学家vigenenre发明的。vigenenre密码使用一个词组作为密钥,密钥中每一个字母用来确定一个代换表,每一个密钥字母被用来加密一个明文字母,第一个密钥字母加密第一个明文字母,第二个密钥字母加密第二个明文字母,等所有密钥字母使用完后,密钥再次循环使用,于是加解密前需先将明密文按照密钥长度进行分组。

密码算法可表示如下:。

设明文串为:

m=m1m2…mn,mi∈charset, n是明文长度

秘钥为:

k=k1k2…kd,ki∈charset, d是秘钥长度

密文为:

c=c1c2…cn,ci∈charset, n是密文长度

加密算法:

cj+td=(mj+td+kj ) mod 26

j=1…d,  t=0…ceiling(n/d)-1

其中ceiling(x)函数表示不小于x最小整数

解密算法:

mj+td=(cj+td -kj ) mod 26

j=1…d, t=0…ceiling(n/d)-1

其中ceiling(x)函数表示不小于x最小整数

加解密代码如下

?
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
def vigenereencrypto(message, key):
 mslen = len(message)
 keylen = len(key)
 message = message.upper()
 key = key.upper()
 raw = "abcdefghijklmnopqrstuvwxyz"# 明文空间
 # 定义加密后的字符串
 ciphertext = ""
 # 开始加密
 for i in range(0, mslen):
  # 轮询key的字符
  j = i % keylen
  # 判断字符是否为英文字符,不是则直接向后面追加且继续
  if message[i] not in raw:
   ciphertext += message[i]
   continue
  encodechr = chr((ord(message[i]) - ord("a") + ord(key[j]) - ord("a")) % 26 + ord("a"))
  # 追加字符
  ciphertext += encodechr
 # 返回加密后的字符串
 return ciphertext
if __name__ == "__main__":
 message = "hello, world!"
 key = "key"
 text = vigenereencrypto(message, key)
 print(text)
def vigeneredecrypto(ciphertext, key):
 mslen = len(ciphertext)
 keylen = len(key)
 key = key.upper()
 raw = "abcdefghijklmnopqrstuvwxyz"# 密文空间
 plaintext = ""
 for i in range(0, mslen):# 开始解密
  # 轮询key的字符
  j = i % keylen
  # 判断字符是否为英文字符,不是则直接向后面追加且继续
  if ciphertext[i] not in raw:
   plaintext += ciphertext[i]
   continue
  decodechr = chr((ord(ciphertext[i]) - ord("a") - ord(key[j]) - ord("a")) % 26 + ord("a"))
  # 追加字符
  plaintext += decodechr
 # 返回加密后的字符串
 return plaintext
if __name__=="__main__":
 ciphertext = "rijvs, ambpb!"
 key = "key"
 text = vigeneredecrypto(ciphertext, key)
 print(text)
import vigeneredecrypto
import vigenereencrypto
def main():
 info = '''==========********=========='''# 开始加密
 print(info, "\n------维吉尼亚加密算法------")
 print(info)
 # 读取测试文本文档
 message = open("test.txt","r+").read()
 print("读取测试文本文档:test.txt")
 print("开始加密!")
 # 输入key
 key = input("请输入密钥:")
 # 进入加密算法
 ciphertext = vigenereencrypto.vigenereencrypto(message, key)
 # 写入密文文本文档
 c = open("ciphertext.txt", "w+")
 c.write(ciphertext)
 c.close()
 print("加密后得到的密文是: \n" + ciphertext)
 # 开始解密
 print(info, "\n------维吉尼亚解密算法------")
 print(info)
 # 读取加密文本文档
 print("读取密文文本文档:ciphertext.txt")
 ciphertext = open("ciphertext.txt", "r+").read()
 # 进入解密算法
 print("开始解密!")
 plaintext = vigeneredecrypto.vigeneredecrypto(ciphertext, key)
 p = open("plaintext.txt", "w+")
 # 写入解密文本文档
 p.write(plaintext)
 p.close()
 print("解密后得到的明文是 : \n" + plaintext)
if __name__=="__main__":
 main()

2重合指数法

2.1重合指数

设x=x1x2...xn是一个含有n个字符的字符串,x的重合指数记为ic(x),定义为x中两个随机元素相同的概率。

设y是一个长度为n密文,即y=y1y2...ym,其中y是密文字母,同样来求从中抽到两个相同字母的概率是多少。为此,设na为字母a在这份密文中的频数,设nb为字母b在这份密文中的频数,依此类推

从n个密文字母中抽取两个字母的方式有