维吉尼亚密码
原理
维吉尼亚密码(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_lowercasedef vigenere_encrypt(plaintext: str, key: str) -> str:ciphertext = ''key_index = 0for 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 += 1elif 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 += 1else:ciphertext += charreturn ciphertextdef vigenere_decrypt(ciphertext: str, key: str) -> str:plaintext = ''key_index = 0for 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 += 1elif 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 += 1else:plaintext += charreturn plaintext