playfair密码用Python实现加解密
时间: 2023-11-05 08:11:23 浏览: 117
playfair多码代换加密解密的C语言实现
Playfair密码是一种经典的替换密码,它将明文中的每个字母替换为一个密文字母对。下面是一个用 Python 实现 Playfair 密码加解密的示例代码:
```python
def prepare_input(s):
"""将字符串转换为有效的 Playfair 输入"""
# 去除所有非字母字符并转为大写
ans = "".join(filter(str.isalpha, s.upper()))
# 将字母 J 替换为 I
ans = ans.replace("J", "I")
return ans
def prepare_key(s):
"""将字符串转换为有效的 Playfair 密钥"""
# 去除所有非字母字符并转为大写
ans = "".join(filter(str.isalpha, s.upper()))
# 将字母 J 替换为 I
ans = ans.replace("J", "I")
# 去除密钥中重复的字母
ans = "".join(sorted(set(ans), key=ans.index))
return ans
def generate_table(key):
"""生成 Playfair 加密表"""
alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"
# 生成初始表格
table = []
for c in key:
if c not in table:
table.append(c)
for c in alphabet:
if c not in table:
table.append(c)
# 将表格转换为 5x5 的矩阵
matrix = [table[i:i+5] for i in range(0, 25, 5)]
return matrix
def find_letter(letter, matrix):
"""找到字母在 Playfair 加密表中的位置"""
for i, row in enumerate(matrix):
for j, col in enumerate(row):
if col == letter:
return i, j
return None
def encrypt(message, key):
"""使用 Playfair 密码加密消息"""
message = prepare_input(message)
key = prepare_key(key)
table = generate_table(key)
# 将消息中的奇数个字母用 X 补齐
if len(message) % 2 == 1:
message += "X"
# 将消息拆分为字母对并加密每个字母对
ciphertext = ""
for i in range(0, len(message), 2):
a, b = message[i], message[i+1]
row1, col1 = find_letter(a, table)
row2, col2 = find_letter(b, table)
if row1 == row2:
ciphertext += table[row1][(col1+1)%5] + table[row2][(col2+1)%5]
elif col1 == col2:
ciphertext += table[(row1+1)%5][col1] + table[(row2+1)%5][col2]
else:
ciphertext += table[row1][col2] + table[row2][col1]
return ciphertext
def decrypt(ciphertext, key):
"""使用 Playfair 密码解密消息"""
key = prepare_key(key)
table = generate_table(key)
# 将消息拆分为字母对并解密每个字母对
plaintext = ""
for i in range(0, len(ciphertext), 2):
a, b = ciphertext[i], ciphertext[i+1]
row1, col1 = find_letter(a, table)
row2, col2 = find_letter(b, table)
if row1 == row2:
plaintext += table[row1][(col1-1)%5] + table[row2][(col2-1)%5]
elif col1 == col2:
plaintext += table[(row1-1)%5][col1] + table[(row2-1)%5][col2]
else:
plaintext += table[row1][col2] + table[row2][col1]
return plaintext
```
使用示例:
```python
key = "SECRETKEY"
message = "HELLO WORLD"
ciphertext = encrypt(message, key)
print(ciphertext) # 输出: KRVWYUZSUKJU
plaintext = decrypt(ciphertext, key)
print(plaintext) # 输出: HELXOWORLD
```
注意,这个实现中没有考虑到 Playfair 加密表中的 Q 字母,因为它通常会和 U 组合成一个字母对。同时,这个实现中还没有进行输入验证,所以如果输入包含非字母字符,可能会导致程序崩溃。
阅读全文