mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-04-19 12:58:04 +00:00
172 lines
No EOL
6.6 KiB
Python
Executable file
172 lines
No EOL
6.6 KiB
Python
Executable file
from .BaseCipherEnvironment import BaseCipherEnvironment
|
||
|
||
S_BOX = {
|
||
0x00: 0x0F, 0x01: 0x0A, 0x02: 0x07, 0x03: 0x05,
|
||
0x04: 0x09, 0x05: 0x03, 0x06: 0x0D, 0x07: 0x00,
|
||
0x08: 0x0E, 0x09: 0x08, 0x0A: 0x04, 0x0B: 0x06,
|
||
0x0C: 0x01, 0x0D: 0x02, 0x0E: 0x0B, 0x0F: 0x0C
|
||
}
|
||
|
||
INV_S_BOX = {
|
||
0x0F: 0x00, 0x0A: 0x01, 0x07: 0x02, 0x05: 0x03,
|
||
0x09: 0x04, 0x03: 0x05, 0x0D: 0x06, 0x00: 0x07,
|
||
0x0E: 0x08, 0x08: 0x09, 0x04: 0x0A, 0x06: 0x0B,
|
||
0x01: 0x0C, 0x02: 0x0D, 0x0B: 0x0E, 0x0C: 0x0F
|
||
}
|
||
|
||
KEY = b'1234567890ABCDEF'
|
||
|
||
def xor_bytes(a, b):
|
||
return bytes(x ^ y for x, y in zip(a, b))
|
||
|
||
|
||
def substitute(bytes_data, box):
|
||
result = bytearray()
|
||
for byte in bytes_data:
|
||
high_nibble = (byte >> 4) & 0x0F
|
||
low_nibble = byte & 0x0F
|
||
substituted_high = box[high_nibble]
|
||
substituted_low = box[low_nibble]
|
||
combined_byte = (substituted_high << 4) | substituted_low
|
||
result.append(combined_byte)
|
||
return bytes(result)
|
||
|
||
def simple_permute(bytes_data):
|
||
return bytes(((b << 1) & 0xFF) | ((b >> 7) & 0x01) for b in bytes_data)
|
||
|
||
def inverse_permute(bytes_data):
|
||
return bytes(((b >> 1) & 0xFF) | ((b << 7) & 0x80) for b in bytes_data)
|
||
|
||
|
||
class KorSBOXCipherEnvironment(BaseCipherEnvironment):
|
||
def __init__(self, *args, **kwargs):
|
||
problem_description = "SBOX Cipher from kor-bench"
|
||
super().__init__(problem_description, *args, **kwargs)
|
||
|
||
@property
|
||
def cipher_name(self) -> str:
|
||
return "Kor_rule22_SBOXCipher"
|
||
|
||
def encode(self, text, **kwargs):
|
||
print("开始加密过程...")
|
||
# 将输入转换为大写字母和空格
|
||
text = ''.join(char.upper() for char in text if char.isalnum() or char.isspace())
|
||
print(f"1. 规范化输入文本: {text}")
|
||
|
||
# 使用给定的加密代码进行加密
|
||
print("2. 开始分块处理...")
|
||
blocks = [text[i:i+8] for i in range(0, len(text), 8)]
|
||
encrypted_blocks = []
|
||
|
||
for i, block in enumerate(blocks):
|
||
print(f"\n处理第{i+1}个块: {block}")
|
||
block = block.ljust(8, '\x00')
|
||
print(f" - 填充后的块: {block}")
|
||
|
||
state = xor_bytes(block.encode('ascii'), KEY)
|
||
print(f" - 与密钥XOR后: {state.hex().upper()}")
|
||
|
||
state = substitute(state, S_BOX)
|
||
print(f" - S盒替换后: {state.hex().upper()}")
|
||
|
||
state = simple_permute(state)
|
||
print(f" - 左移置换后: {state.hex().upper()}")
|
||
|
||
state = xor_bytes(state, KEY)
|
||
print(f" - 最终与密钥XOR后: {state.hex().upper()}")
|
||
|
||
encrypted_blocks.append(''.join(f'{b:02X}' for b in state))
|
||
|
||
result = ''.join(encrypted_blocks)
|
||
print(f"\n最终加密结果: {result}")
|
||
return result
|
||
|
||
def decode(self, text, **kwargs):
|
||
print("开始解密过程...")
|
||
print(f"1. 接收到的密文: {text}")
|
||
|
||
print("2. 开始分块处理...")
|
||
blocks = [text[i:i+16] for i in range(0, len(text), 16)]
|
||
decrypted_blocks = []
|
||
|
||
for i, block in enumerate(blocks):
|
||
print(f"\n处理第{i+1}个块: {block}")
|
||
|
||
state = bytes.fromhex(block)
|
||
print(f" - 转换为字节: {state.hex().upper()}")
|
||
|
||
state = xor_bytes(state, KEY)
|
||
print(f" - 与密钥XOR后: {state.hex().upper()}")
|
||
|
||
state = inverse_permute(state)
|
||
print(f" - 右移置换后: {state.hex().upper()}")
|
||
|
||
state = substitute(state, INV_S_BOX)
|
||
print(f" - 逆S盒替换后: {state.hex().upper()}")
|
||
|
||
state = xor_bytes(state, KEY)
|
||
print(f" - 最终与密钥XOR后: {state.hex().upper()}")
|
||
|
||
decrypted_blocks.append(state.decode('ascii').rstrip('\x00'))
|
||
|
||
result = ''.join(decrypted_blocks)
|
||
print(f"\n最终解密结果: {result}")
|
||
return result
|
||
|
||
def get_encode_rule(self, ):
|
||
return """加密规则:
|
||
- 输入:
|
||
- 明文: 大写字母和空格组成的字符串
|
||
- 输出:
|
||
- 密文: 表示加密数据的十六进制字符串(其中A-E需要大写)
|
||
- 准备:
|
||
- 固定密钥
|
||
- KEY = b'1234567890ABCDEF'
|
||
- S盒
|
||
- S_BOX = {
|
||
0x00: 0x0F, 0x01: 0x0A, 0x02: 0x07, 0x03: 0x05,
|
||
0x04: 0x09, 0x05: 0x03, 0x06: 0x0D, 0x07: 0x00,
|
||
0x08: 0x0E, 0x09: 0x08, 0x0A: 0x04, 0x0B: 0x06,
|
||
0x0C: 0x01, 0x0D: 0x02, 0x0E: 0x0B, 0x0F: 0x0C
|
||
}
|
||
- 加密步骤:
|
||
1. 填充: 如果明文长度不是8字节的倍数,用\\x00(空字符)填充使其长度成为8字节的倍数
|
||
2. 分块: 将填充后的明文分成8字节的块
|
||
3. 块加密:
|
||
- 转换为字节: 使用ASCII编码将每个块转换为字节
|
||
- 与密钥XOR: 字节块与固定密钥进行XOR运算
|
||
- 替换: 使用S盒替换每个字节的高4位和低4位并拼接
|
||
- 置换: 通过将每个字节左移1位进行简单置换
|
||
- 与密钥XOR: 置换后的字节块再次与固定密钥进行XOR运算
|
||
4. 十六进制编码: 将加密后的字节块转换为十六进制字符串
|
||
5. 拼接: 将所有加密块的十六进制字符串拼接形成最终密文"""
|
||
|
||
def get_decode_rule(self, ):
|
||
return """解密规则:
|
||
- 输入:
|
||
- 密文: 表示加密数据的十六进制字符串(其中A-E需要大写)
|
||
- 输出:
|
||
- 明文: 大写字母和空格组成的字符串
|
||
- 准备:
|
||
- 固定密钥
|
||
- KEY = b'1234567890ABCDEF'
|
||
- 逆S盒
|
||
- INV_S_BOX = {
|
||
0x0F: 0x00, 0x0A: 0x01, 0x07: 0x02, 0x05: 0x03,
|
||
0x09: 0x04, 0x03: 0x05, 0x0D: 0x06, 0x00: 0x07,
|
||
0x0E: 0x08, 0x08: 0x09, 0x04: 0x0A, 0x06: 0x0B,
|
||
0x01: 0x0C, 0x02: 0x0D, 0x0B: 0x0E, 0x0C: 0x0F
|
||
}
|
||
- 解密步骤:
|
||
1. 分块: 将密文分成16字符(8字节)的块
|
||
2. 块解密:
|
||
- 转换为字节: 将每个块从十六进制字符串转换为字节
|
||
- 与密钥XOR: 字节块与固定密钥进行XOR运算
|
||
- 逆置换: 通过将每个字节右移1位进行逆置换
|
||
- 替换: 使用逆S盒替换块中字节的高4位和低4位并拼接
|
||
- 与密钥XOR: 字节块再次与固定密钥进行XOR运算
|
||
3. 转换为文本: 使用ASCII解码将解密后的字节块转换回文本
|
||
4. 移除填充: 从解密后的明文末尾移除填充字符(\\x00)
|
||
5. 拼接: 将所有解密块拼接形成最终明文"""
|
||
|
||
|