维吉尼亚密码
原理
维吉尼亚密码(Vigenere)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
下面给出一个例子
明文:come greatwall
密钥:crypto
首先,对密钥进行填充使其长度与明文长度一样。
明文 | c | o | m | e | g | r | e | a | t | w | a | l | l |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
密钥 | c | r | y | p | t | o | c | r | y | p | t | o | c |
其次,查表得密文
明文:come greatwall
密钥:crypto
密文:efkt zferrltzn
加解密脚本
from string import ascii_uppercase, ascii_lowercase
def vigenere_encrypt(plaintext: str, key: str) -> str:
ciphertext = ''
key_index = 0
for char in plaintext:
if char in ascii_uppercase:
# 计算偏移量
key_char = key[key_index % len(key)]
shift = ord(key_char) - ord('A')
# 加密字符
ciphertext += chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
key_index += 1
elif char in ascii_lowercase:
key_char = key[key_index % len(key)]
shift = ord(key_char) - ord('a')
# 加密字符
ciphertext += chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
key_index += 1
else:
ciphertext += char
return ciphertext
def vigenere_decrypt(ciphertext: str, key: str) -> str:
plaintext = ''
key_index = 0
for char in ciphertext:
if char in ascii_uppercase:
# 计算偏移量
key_char = key[key_index % len(key)]
shift = ord(key_char) - ord('A')
# 解密字符
plaintext += chr((ord(char) - ord('A') - shift) % 26 + ord('A'))
key_index += 1
elif char in ascii_lowercase:
# 计算偏移量
key_char = key[key_index % len(key)]
shift = ord(key_char) - ord('a')
# 解密字符
plaintext += chr((ord(char) - ord('a') - shift) % 26 + ord('a'))
key_index += 1
else:
plaintext += char
return plaintext