InternBootcamp/internbootcamp/libs/cipher/KorPolybiusSquareCipherEnvironment.py
2025-05-23 15:27:15 +08:00

112 lines
No EOL
3.5 KiB
Python
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from .BaseCipherEnvironment import BaseCipherEnvironment
polybius_square = [
['R', 'T', 'X', 'F', 'S'],
['W', 'C', 'M', 'V', 'H'],
['Z', 'J', 'A', 'P', 'B'],
['L', 'Q', 'Y', 'G', 'K'],
['N', 'E', 'U', 'D', 'I']
]
def find_position(char):
for i in range(len(polybius_square)):
for j in range(len(polybius_square[i])):
if polybius_square[i][j] == char:
return i + 1, j + 1
return None
class KorPolybiusSquareCipherEnvironment(BaseCipherEnvironment):
def __init__(self, *args, **kwargs):
problem_description = "Polybius Square Cipher from KOR-bench"
super().__init__(problem_description, *args, **kwargs)
@property
def cipher_name(self) -> str:
return "Kor_rule4_PolybiusSquareCipher"
def encode(self, text, **kwargs):
print(f"开始加密文本: {text}")
# 转换为大写并只保留字母
text = ''.join([c.upper() for c in text if c.isalpha()])
print(f"预处理后的文本: {text}")
encrypted_text = ""
print("开始逐字符加密:")
for char in text:
print(f"处理字符: {char}")
if char == 'O':
encrypted_text += '66'
print(f"字符 {char} 不在Polybius方阵中替换为: 66")
else:
row, col = find_position(char)
if row and col:
encrypted_text += f"{row}{col}"
print(f"字符 {char} 在方阵中的位置是: 第{row}行第{col}列,替换为: {row}{col}")
print(f"最终加密结果: {encrypted_text}")
return encrypted_text
def decode(self, text, **kwargs):
print(f"开始解密文本: {text}")
decrypted_text = ""
i = 0
print("开始逐对数字解密:")
while i < len(text):
if text[i:i+2] == '66':
decrypted_text += 'O'
print(f"遇到数字对: 66解密为: O")
i += 2
elif text[i].isdigit():
row = int(text[i])
col = int(text[i+1])
char = polybius_square[row-1][col-1]
decrypted_text += char
print(f"遇到数字对: {row}{col},对应方阵位置: 第{row}行第{col}列,解密为: {char}")
i += 2
print(f"最终解密结果: {decrypted_text}")
return decrypted_text
def get_decode_rule(self, ):
decode_rule = """
解密规则:
- 输入:
- 密文: 字符串
- 输出:
- 明文: 大写字母字符串
- 准备:
- Polybius方阵(与加密相同)
- 解密步骤(与加密步骤相反):
- 对于密文中的每对数字CrCc:
- 根据CrCc表示的行列号在Polybius方阵中找到对应字母
- 如果CrCc=66替换为"O"
"""
return decode_rule
def get_encode_rule(self, ):
encode_rule = """
加密规则:
- 输入:
- 明文: 大写字母字符串,不含标点和空格
- 输出:
- 密文: 大写字母字符串
- 准备:
- Polybius方阵:
1 2 3 4 5
1 R T X F S
2 W C M V H
3 Z J A P B
4 L Q Y G K
5 N E U D I
- 加密步骤:
- 对于每个明文字符p:
- 如果p是存在于Polybius方阵中的大写字母:
- 用字符在方阵中的行号和列号(都从1开始计数)替换该字符
- 特别地字母O不存在于方阵中用66替换
"""
return encode_rule