维吉尼亚密码原理及Python实现

简介

维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。

算法描述

  1. 加密过程:明文字母p对应的列和秘钥字母k对应的行的交叉点就是加密字母后的密文字母
  2. 解密过程:在密钥字母k对应的行找到对应密文字母,则该密文字母对应的列的字母就是明文字母

下图就是维吉尼亚密码的表格,我们需要构造这样的一个表去查,代码是将其变成了一维的形式然后实现的

F5UNH1.png

核心代码及分析

字母的偏移问题,我这里是分开大小写字母进行加解密的,也就是说大写加解密后还是大写,小写加解密后还是小写,然后从26个字母里面选择,所以必须注意边界问题,需要对26取余。

1
2
letter_list = string.ascii_uppercase
letter_list2 = string.ascii_lowercase

代码只对字母进行加解密,代码里面需要注意的是一下细节问题,比如在密钥使用完过后需要循环使用,这里用的是取余加上一个标记flag去实现,然后从字母列表里面选取对应的字母即可。加解密代码如下:

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
def Encrypt(message,key):
ciphertext = ""
flag = 0
key_list = key
for plain in message:
if flag % len(key_list) == 0:
flag = 0
if plain.isalpha(): #判断是否为英文
if plain.isupper():
ciphertext += letter_list[(ord(plain) - 65 + key_list[flag]) % 26] #行偏移加上列偏移
flag += 1
if plain.islower():
ciphertext += letter_list2[(ord(plain) - 97 + key_list[flag]) % 26]
flag += 1
else:#不是英文不加密
ciphertext += plain

return ciphertext

def Decrypt(message,key):
plaintext = ""
flag = 0
key_list = key
for cipher in message:
if flag % len(key_list) == 0:
flag = 0
if cipher.isalpha():
if cipher.isupper():
plaintext += letter_list[(ord(cipher) - 65 - key_list[flag]) %26]
flag += 1
if cipher.islower():
plaintext += letter_list2[(ord(cipher) - 97 - key_list[flag]) % 26]
flag += 1
else:
plaintext += cipher
return plaintext

正确性

这里以输入”helloworld”为例,然后进行加解密,能够正确完成

F5UGjJ.png

详细代码(放在github上了):维吉尼亚密码


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. 简介
  2. 2. 算法描述
  3. 3. 核心代码及分析
  4. 4. 正确性
  5. 5. 详细代码(放在github上了):维吉尼亚密码