init-commit

This commit is contained in:
lilinyang 2025-05-23 15:27:15 +08:00
commit 18a552597a
3461 changed files with 1150579 additions and 0 deletions

View file

@ -0,0 +1,221 @@
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. 输出解密后的文本。"