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

158 lines
6.1 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
class JeffersonCipher:
def __init__(self):
self.wheel_configuration = [
"ABCEIGDJFVUYMHTQKZOLRXSPWN",
"ACDEHFIJKTLMOUVYGZNPQXRWSB",
"ADKOMJUBGEPHSCZINXFYQRTVWL",
"AEDCBIFGJHLKMRUOQVPTNWYXZS",
"AFNQUKDOPITJBRHCYSLWEMZVXG",
"AGPOCIXLURNDYZHWBJSQFKVMET",
"AHXJEZBNIKPVROGSYDULCFMQTW",
"AIHPJOBWKCVFZLQERYNSUMGTDX",
"AJDSKQOIVTZEFHGYUNLPMBXWCR",
"AKELBDFJGHONMTPRQSVZUXYWIC",
"ALTMSXVQPNOHUWDIZYCGKRFBEJ",
"AMNFLHQGCUJTBYPZKXISRDVEWO",
"ANCJILDHBMKGXUZTSWQYVORPFE",
"AODWPKJVIUQHZCTXBLEGNYRSMF",
"APBVHIYKSGUENTCXOWFQDRLJZM",
"AQJNUBTGIMWZRVLXCSHDEOKFPY",
"ARMYOFTHEUSZJXDPCWGQIBKLNV",
"ASDMCNEQBOZPLGVJRKYTFUIWXH",
"ATOJYLFXNGWHVCMIRBSEKUPDZQ",
"AUTRZXQLYIOVBPESNHJWMDGFCK",
"AVNKHRGOXEYBFSJMUDQCLZWTIP",
"AWVSFDLIEBHKNRJQZGMXPUCOTY",
"AXKWREVDTUFOYHMLSIQNJCPGBZ",
"AYJPXMVKBQWUGLOSTECHNZFRID",
"AZDNBUHYFWJLVGRCQMPSOEXTKI"
]
def encrypt(self, message):
encrypted_message = []
wheel_position = 0
for char in message:
current_wheel = self.wheel_configuration[wheel_position]
index = current_wheel.index(char)
encrypted_char = current_wheel[(index + 1) % 26]
encrypted_message.append(encrypted_char)
wheel_position = (wheel_position + 1) % len(self.wheel_configuration)
return ''.join(encrypted_message)
def decrypt(self, encrypted_message):
decrypted_message = []
wheel_position = 0
for char in encrypted_message:
current_wheel = self.wheel_configuration[wheel_position]
index = current_wheel.index(char)
decrypted_char = current_wheel[(index - 1) % 26]
decrypted_message.append(decrypted_char)
wheel_position = (wheel_position + 1) % len(self.wheel_configuration)
return ''.join(decrypted_message)
class KorJeffersonCipherEnvironment(BaseCipherEnvironment):
def __init__(self, *args, **kwargs):
problem_description = ''
super().__init__(problem_description, *args, **kwargs)
@property
def cipher_name(self) -> str:
return 'Kor_rule10_JeffersonCipher'
def encode(self, text, **kwargs):
# 将输入转换为大写字母并移除非字母字符
text = ''.join([char.upper() for char in text if char.isalpha()])
print(f"处理后的输入文本: {text}")
cipher = JeffersonCipher()
print("初始化Jefferson密码轮...")
print("开始加密过程:")
print("- 从第1个密码轮开始")
encrypted = cipher.encrypt(text)
print(f"- 对每个字符:")
for i, (plain, cipher) in enumerate(zip(text, encrypted)):
wheel_num = (i % 25) + 1
print(f" * 在第{wheel_num}个密码轮上,将字符 {plain} 替换为下一个字符 {cipher}")
print(f"加密完成,结果: {encrypted}")
return encrypted
def decode(self, text, **kwargs):
cipher = JeffersonCipher()
print("初始化Jefferson密码轮...")
print("开始解密过程:")
print("- 从第1个密码轮开始")
decrypted = cipher.decrypt(text)
print(f"- 对每个字符:")
for i, (cipher, plain) in enumerate(zip(text, decrypted)):
wheel_num = (i % 25) + 1
print(f" * 在第{wheel_num}个密码轮上,将字符 {cipher} 替换为前一个字符 {plain}")
print(f"解密完成,结果: {decrypted}")
return decrypted
def get_encode_rule(self, ):
return """加密规则:
- 输入:
- 明文: 仅包含大写字母的字符串,不含标点和空格
- 输出:
- 密文: 大写字母字符串
- 准备:
- 25个密码轮每个密码轮包含26个字母的不同排列
[
"ABCEIGDJFVUYMHTQKZOLRXSPWN",
"ACDEHFIJKTLMOUVYGZNPQXRWSB",
"ADKOMJUBGEPHSCZINXFYQRTVWL",
"AEDCBIFGJHLKMRUOQVPTNWYXZS",
"AFNQUKDOPITJBRHCYSLWEMZVXG",
"AGPOCIXLURNDYZHWBJSQFKVMET",
"AHXJEZBNIKPVROGSYDULCFMQTW",
"AIHPJOBWKCVFZLQERYNSUMGTDX",
"AJDSKQOIVTZEFHGYUNLPMBXWCR",
"AKELBDFJGHONMTPRQSVZUXYWIC",
"ALTMSXVQPNOHUWDIZYCGKRFBEJ",
"AMNFLHQGCUJTBYPZKXISRDVEWO",
"ANCJILDHBMKGXUZTSWQYVORPFE",
"AODWPKJVIUQHZCTXBLEGNYRSMF",
"APBVHIYKSGUENTCXOWFQDRLJZM",
"AQJNUBTGIMWZRVLXCSHDEOKFPY",
"ARMYOFTHEUSZJXDPCWGQIBKLNV",
"ASDMCNEQBOZPLGVJRKYTFUIWXH",
"ATOJYLFXNGWHVCMIRBSEKUPDZQ",
"AUTRZXQLYIOVBPESNHJWMDGFCK",
"AVNKHRGOXEYBFSJMUDQCLZWTIP",
"AWVSFDLIEBHKNRJQZGMXPUCOTY",
"AXKWREVDTUFOYHMLSIQNJCPGBZ",
"AYJPXMVKBQWUGLOSTECHNZFRID",
"AZDNBUHYFWJLVGRCQMPSOEXTKI"
]
- 加密步骤:
- 初始选择第1个密码轮
- 对明文中的每个字符p:
- 在当前密码轮上找到字符p用其后一个字符替换得到密文字符
- 如果当前字符在密码轮末尾,则回到密码轮开头
- 移动到下一个密码轮处理下一个字符,当到达最后一个密码轮时,返回第一个密码轮继续加密过程"""
def get_decode_rule(self, ):
return """解密规则:
- 输入:
- 密文: 大写字母字符串
- 输出:
- 明文: 大写字母字符串
- 准备:
- 25个密码轮与加密相同
- 解密步骤(与加密步骤相反):
- 初始选择第1个密码轮
- 对密文中的每个字符c:
- 在当前密码轮上找到字符c用其前一个字符替换得到明文字符
- 如果当前字符在密码轮开头,则回到密码轮末尾
- 移动到下一个密码轮处理下一个字符,当到达最后一个密码轮时,返回第一个密码轮继续解密过程"""