mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-04-19 12:58:04 +00:00
221 lines
9 KiB
Python
Executable file
221 lines
9 KiB
Python
Executable file
from .BaseCipherEnvironment import BaseCipherEnvironment
|
||
|
||
def create_cipher_matrix(key):
|
||
"""
|
||
根据给定的密钥构建5x5的加密矩阵。
|
||
参数:
|
||
- key: 用于构建矩阵的字符串
|
||
|
||
返回:
|
||
- 5x5加密矩阵
|
||
"""
|
||
unique_key = "".join(dict.fromkeys(key.upper()))
|
||
alphabet = "ABCDEFGHIJKLMNOPRSTUVWXYZ" # delete Q
|
||
remaining_letters = "".join([ch for ch in alphabet if ch not in unique_key])
|
||
full_key = unique_key + remaining_letters
|
||
matrix = [list(full_key[i:i + 5]) for i in range(0, 25, 5)]
|
||
return matrix
|
||
|
||
|
||
def find_position(matrix, char):
|
||
"""
|
||
查找字符在给定矩阵中的位置。
|
||
参数:
|
||
- matrix: 5x5的矩阵
|
||
- char: 需要查找的字符
|
||
|
||
返回:
|
||
- 字符在矩阵中的行列位置(tuple)
|
||
"""
|
||
if char == 'Q':
|
||
return (4, 2)
|
||
for i, row in enumerate(matrix):
|
||
if char in row:
|
||
return (i, row.index(char))
|
||
return (-1, -1)
|
||
|
||
class FourSquareCipherEnvironment(BaseCipherEnvironment):
|
||
def __init__(self, *args, **kwargs):
|
||
problem_description = ''
|
||
super().__init__(problem_description, *args, **kwargs)
|
||
|
||
@property
|
||
def cipher_name(self) -> str:
|
||
return "FourSquareCipher"
|
||
|
||
def encode(self, text, str1, str2, ):
|
||
"""
|
||
使用Four-square Cipher算法加密文本。
|
||
参数:
|
||
- str1: 第一个密钥字符串,用于构建第一个加密矩阵
|
||
- str2: 第二个密钥字符串,用于构建第二个加密矩阵
|
||
- text: 待加密的明文字符串
|
||
|
||
返回:
|
||
- 加密后的字符串
|
||
"""
|
||
# 打印解题方案
|
||
print("解题方案:")
|
||
print("1. 构建3个矩阵:默认字母表矩阵M_T,加密矩阵M1和M2(由str1和str2生成)。")
|
||
print("2. 将明文文本转换为大写字母,仅保留字母字符并分成两个字母一组。")
|
||
print("3. 对每对字母进行加密:")
|
||
print(" - 查找每个字母在默认矩阵中的位置,交换其y坐标,")
|
||
print(" - 根据新坐标从M1和M2矩阵中取出加密后的字母对。")
|
||
print("4. 输出加密后的文本。\n")
|
||
# 创建默认字母表矩阵(去除Q)
|
||
default_matrix = create_cipher_matrix("ABCDEFGHIJKLMNOPRSTUVWXYZ")
|
||
print("Step 1: 创建默认字母表矩阵 M_T (去除Q):")
|
||
for row in default_matrix:
|
||
print(" ".join(row))
|
||
print()
|
||
|
||
# 使用str1和str2创建两个加密矩阵
|
||
matrix1 = create_cipher_matrix(str1)
|
||
matrix2 = create_cipher_matrix(str2)
|
||
|
||
print("Step 2: 使用密钥构建加密矩阵 M1 和 M2")
|
||
print("M1 矩阵 (根据密钥 str1):")
|
||
for row in matrix1:
|
||
print(" ".join(row))
|
||
print("\nM2 矩阵 (根据密钥 str2):")
|
||
for row in matrix2:
|
||
print(" ".join(row))
|
||
print()
|
||
|
||
# 将明文转换为大写并移除非字母字符
|
||
text = ''.join(filter(str.isalpha, text.upper()))
|
||
|
||
# 如果明文字符个数为奇数,补一个字符 'X'
|
||
if len(text) % 2 != 0:
|
||
print('明文字符个数为奇数,补一个字符 X')
|
||
text += "X"
|
||
|
||
# 两个字母一组分组
|
||
pairs = [text[i:i + 2] for i in range(0, len(text), 2)]
|
||
print("Step 3: 将明文分成两个字母一组:", pairs)
|
||
print()
|
||
|
||
encrypted_text = []
|
||
|
||
# 遍历每对字母进行加密
|
||
for idx, pair in enumerate(pairs):
|
||
print(f"Step 4.{idx + 1}: 加密字母对 {pair}")
|
||
|
||
# 查找两个字母在默认字母表矩阵中的位置
|
||
pos1 = find_position(default_matrix, pair[0])
|
||
pos2 = find_position(default_matrix, pair[1])
|
||
|
||
print(f" - {pair[0]} 在 M_T 中的位置: {pos1}")
|
||
print(f" - {pair[1]} 在 M_T 中的位置: {pos2}")
|
||
|
||
# 交换y坐标,得到新位置
|
||
new_pos1 = (pos1[0], pos2[1])
|
||
new_pos2 = (pos2[0], pos1[1])
|
||
|
||
print(f" - 交换列索引后新位置: {new_pos1} 和 {new_pos2}")
|
||
|
||
# 从第一个和第二个加密矩阵中取出新位置上的字母
|
||
encrypted_char1 = matrix1[new_pos1[0]][new_pos1[1]]
|
||
encrypted_char2 = matrix2[new_pos2[0]][new_pos2[1]]
|
||
|
||
print(f" - 在 M1 中查找位置 {new_pos1} 的字母: {encrypted_char1}")
|
||
print(f" - 在 M2 中查找位置 {new_pos2} 的字母: {encrypted_char2}")
|
||
print(f" - 加密结果为: {encrypted_char1 + encrypted_char2}\n")
|
||
|
||
# 将加密后的字母添加到结果列表中
|
||
encrypted_text.append(encrypted_char1 + encrypted_char2)
|
||
|
||
# 返回加密结果,每两个字母用空格分隔
|
||
final_result = " ".join(encrypted_text)
|
||
print("加密完成!最终加密结果为:", final_result)
|
||
return final_result
|
||
|
||
|
||
def decode(self, text, str1, str2):
|
||
"""
|
||
使用Four-square Cipher算法解密文本。
|
||
参数:
|
||
- str1: 第一个密钥字符串,用于构建第一个加密矩阵
|
||
- str2: 第二个密钥字符串,用于构建第二个加密矩阵
|
||
- text: 待解密的密文字符串
|
||
|
||
返回:
|
||
- 解密后的字符串
|
||
"""
|
||
# 打印解题方案
|
||
print("解题方案:")
|
||
print("1. 构建3个矩阵:默认字母表矩阵M_T,加密矩阵M1和M2(由str1和str2生成)。")
|
||
print("2. 将密文按两个字母一组分组。")
|
||
print("3. 对每对加密字母进行解密:")
|
||
print(" - 在M1和M2中找到加密字母的位置,交换列坐标")
|
||
print(" - 从默认矩阵中获取对应的明文字母。")
|
||
print("4. 输出解密后的文本。\n")
|
||
|
||
# 创建默认字母表矩阵(去除Q)
|
||
default_matrix = create_cipher_matrix("ABCDEFGHIJKLMNOPRSTUVWXYZ") # delete Q
|
||
print("Step 1: 创建默认字母表矩阵 M_T (去除Q):")
|
||
for row in default_matrix:
|
||
print(" ".join(row))
|
||
print()
|
||
|
||
# 使用str1和str2创建两个加密矩阵
|
||
matrix1 = create_cipher_matrix(str1)
|
||
matrix2 = create_cipher_matrix(str2)
|
||
|
||
print("Step 2: 使用密钥构建加密矩阵 M1 和 M2")
|
||
print("M1 矩阵 (根据密钥 str1):")
|
||
for row in matrix1:
|
||
print(" ".join(row))
|
||
print("\nM2 矩阵 (根据密钥 str2):")
|
||
for row in matrix2:
|
||
print(" ".join(row))
|
||
print()
|
||
|
||
# 将密文转换为大写并按两个字母一组分组
|
||
text = ''.join(filter(str.isalpha, text.upper()))
|
||
pairs = [text[i:i + 2] for i in range(0, len(text), 2)]
|
||
print("Step 3: 将密文分成两个字母一组:", pairs)
|
||
print()
|
||
|
||
decrypted_text = []
|
||
|
||
# 遍历每对字母进行解密
|
||
for idx, pair in enumerate(pairs):
|
||
print(f"Step 4.{idx + 1}: 解密字母对 {pair}")
|
||
|
||
# 在M1和M2中找到两个加密字母的位置
|
||
pos1 = find_position(matrix1, pair[0])
|
||
pos2 = find_position(matrix2, pair[1])
|
||
|
||
print(f" - {pair[0]} 在 M1 中的位置: {pos1}")
|
||
print(f" - {pair[1]} 在 M2 中的位置: {pos2}")
|
||
|
||
try:
|
||
# 交换列坐标得到新位置
|
||
new_pos1 = (pos1[0], pos2[1])
|
||
new_pos2 = (pos2[0], pos1[1])
|
||
except Exception as e:
|
||
print(e)
|
||
print(f" - 交换列索引后新位置: {new_pos1} 和 {new_pos2}")
|
||
|
||
# 从默认矩阵中取出新位置上的字母
|
||
decrypted_char1 = default_matrix[new_pos1[0]][new_pos1[1]]
|
||
decrypted_char2 = default_matrix[new_pos2[0]][new_pos2[1]]
|
||
|
||
print(f" - 在 M_T 中查找位置 {new_pos1} 的字母: {decrypted_char1}")
|
||
print(f" - 在 M_T 中查找位置 {new_pos2} 的字母: {decrypted_char2}")
|
||
print(f" - 解密结果为: {decrypted_char1 + decrypted_char2}\n")
|
||
|
||
# 将解密后的字母添加到结果列表中
|
||
decrypted_text.append(decrypted_char1 + decrypted_char2)
|
||
|
||
# 返回解密结果,去除多余空格
|
||
final_result = "".join(decrypted_text).strip()
|
||
print("解密完成!最终解密结果为:", final_result)
|
||
return final_result
|
||
|
||
def get_encode_rule(self):
|
||
return "解题方案:\n1. 构建3个矩阵:默认字母表矩阵M_T,加密矩阵M1和M2(由str1和str2生成)。\n2. 将明文文本转换为大写字母,仅保留字母字符并分成两个字母一组。\n3. 对每对字母进行加密:\n - 查找每个字母在默认矩阵中的位置,交换其y坐标,\n - 根据新坐标从M1和M2矩阵中取出加密后的字母对。\n4. 输出加密后的文本。"
|
||
|
||
def get_decode_rule(self):
|
||
return "解题方案:\n1. 构建3个矩阵:默认字母表矩阵M_T,加密矩阵M1和M2(由str1和str2生成)。\n2. 将密文按两个字母一组分组。\n3. 对每对加密字母进行解密:\n - 在M1和M2中找到加密字母的位置,交换列坐标\n - 从默认矩阵中获取对应的明文字母。\n4. 输出解密后的文本。"
|