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

122 lines
4.8 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
key = '10101010'
permutation = (2, 0, 3, 1, 4, 6, 5, 7)
inverse_permutation = (1, 3, 0, 2, 4, 6, 5, 7)
def xor(bits1, bits2):
return ''.join(['1' if b1 != b2 else '0' for b1, b2 in zip(bits1, bits2)])
def permute(bits, perm_table):
return ''.join([bits[i] for i in perm_table])
class KorXORCipherEnvironment(BaseCipherEnvironment):
def __init__(self, *args, **kwargs):
problem_description = "XOR Cipher from kor-bench"
super().__init__(problem_description, *args, **kwargs)
@property
def cipher_name(self) -> str:
return "Kor_rule21_XORCipher"
def encode(self, text, **kwargs):
# 移除非字母字符并转为大写
text = ''.join([char.upper() for char in text if char.isalpha()])
print(f"1. 输入文本处理为: {text}")
encrypted_bits = []
for char in text:
print(f"\n处理字符: {char}")
binary_plaintext = format(ord(char), '08b')
print(f"2. 转换为8位二进制: {binary_plaintext}")
xor_result = xor(binary_plaintext, key * (len(binary_plaintext) // len(key) + 1))[:len(binary_plaintext)]
print(f"3. 与密钥进行XOR运算: {xor_result}")
permuted = permute(xor_result, permutation)
print(f"4. 应用置换表: {permuted}")
encrypted_bits.append(permuted)
encrypted_binary_string = ''.join(encrypted_bits)
print(f"\n最终加密结果: {encrypted_binary_string}")
return encrypted_binary_string
def decode(self, text, **kwargs):
print(f"1. 接收到的加密文本: {text}")
decrypted_chars = []
num_chars = len(text) // 8
for i in range(num_chars):
binary_chunk = text[i*8:(i+1)*8]
print(f"\n处理8位二进制块: {binary_chunk}")
permuted_bits = permute(binary_chunk, inverse_permutation)
print(f"2. 应用逆置换: {permuted_bits}")
xor_result = xor(permuted_bits, key * (len(permuted_bits) // len(key) + 1))[:len(permuted_bits)]
print(f"3. 与密钥进行XOR运算: {xor_result}")
decrypted_char = chr(int(xor_result, 2))
print(f"4. 转换为字符: {decrypted_char}")
decrypted_chars.append(decrypted_char)
result = ''.join(decrypted_chars)
print(f"\n最终解密结果: {result}")
return result
def get_encode_rule(self, ):
encode_rule = """
加密规则:
- 输入:
- 明文: 仅包含大写字母(A-Z)的字符串,不含标点和空格
- 输出:
- 密文: 仅包含0和1的二进制字符串
- 准备:
- 固定密钥: 8位二进制字符串(例如'10101010')
- 置换表:
- 置换表: (2, 0, 3, 1, 4, 6, 5, 7)
- 逆置换表: (1, 3, 0, 2, 4, 6, 5, 7)
- 加密步骤:
1. 将每个字符转换为二进制:
- 将每个字符转换为ASCII值
- 将ASCII值转换为8位二进制字符串
2. XOR运算:
- 对字符的8位二进制表示与固定密钥进行XOR运算
- 如果需要,重复密钥以匹配二进制表示的长度
3. 置换:
- 对XOR结果应用置换表得到每个字符的最终加密二进制字符串
4. 合并二进制字符串:
- 将所有字符的二进制字符串连接形成最终密文
"""
return encode_rule
def get_decode_rule(self, ):
decode_rule = """
解密规则:
- 输入:
- 密文: 仅包含0和1的二进制字符串
- 输出:
- 明文: 仅包含大写字母(A-Z)的字符串,不含标点和空格
- 准备:
- 固定密钥: 与加密使用的相同8位二进制字符串(例如'10101010')
- 置换表:
- 置换表: (2, 0, 3, 1, 4, 6, 5, 7)
- 逆置换表: (1, 3, 0, 2, 4, 6, 5, 7)
- 解密步骤:
1. 将密文分块:
- 将二进制密文分成8位一组每组代表一个加密字符
2. 逆置换:
- 对每个8位块应用逆置换表以还原加密时的置换
3. XOR运算:
- 对置换后的二进制块与固定密钥进行XOR运算
4. 二进制转字符:
- 将得到的二进制字符串转换为十进制值
- 将十进制值转换为对应的ASCII字符
5. 合并字符:
- 将每个二进制块得到的字符连接形成最终明文
"""
return decode_rule