兽音译者编码实现
偶然看到有hero分享资源使用了这个加密,看了一下并不是太难于是学习了一下。这个加密逻辑是基于一个自定义的字符集(beast = ['嗷', '呜', '啊', '~']
)对输入字符串进行编码,将每个字符的 Unicode 值转换为十六进制后,再把每个字符通过(字符+偏移值)÷4的到商和模
映射到beast 中的字符组合。
这里有在线解码的网站:兽音译者_在线兽语翻译转换解码器
加密步骤
-
字符串转十六进制:
- 使用
str2hex
函数将输入字符串的每个字符转换为固定长度的 4 位十六进制表示。(所以超出U+FFFF
的字符,需要5位以上,因此会导致信息丢失)
- 使用
-
(核心)十六进制字符映射到
beast
:- 遍历十六进制字符数组,计算每个字符的偏移值
k
,公式为:k = (int(x, 16) + n) % 16
。 - 根据
k
的值,将其分解为两个索引:k // 4
和k % 4
,分别映射到beast
中的字符。 - 更新累加偏移值
n
,使加密结果具有动态变化。
- 遍历十六进制字符数组,计算每个字符的偏移值
-
生成加密字符串:
- 将映射后的字符组合起来,形成最终的加密字符串。
示例
输入字符串 "你好"
:
-
转换为Unicode:
20320 22909
-
转换为十六进制:
4f60 597d
-
循环计算索引: 比如第二位
f
,k=(15+1)%16=0
-
映射到beast:
beast[0//4]='嗷', beast[0%4]='嗷'
-
加密后结果:
beast[3]beast[1]beast[0]
+呜嗷嗷嗷啊嗷嗷~啊呜~啊~呜呜嗷 +beast[2]
得到
~呜嗷呜嗷嗷嗷啊嗷嗷~啊呜~啊~呜呜嗷啊
最终加密后的数据长度是原始明文长度的 8 倍。
- 字符串转十六进制:每个字符的 Unicode 值被转换为 4 位十六进制字符串,数据长度变为原来的 4 倍。
- 十六进制字符映射到 beast:每个十六进制字符被映射为 2 个字符,数据长度再次翻倍
源代码
使用方法:实例化一个BeastVoice对象,调用encode()和decode()即可
class BeastVoice:
def __init__(self, beast=None):
self.beast = beast or ['嗷', '呜', '啊', '~']
def set_beast(self, beast: list):
if len(beast) == 4:
self.beast = beast
return True
return False
def str2hex(self, text: str) -> str:
ret = ""
for x in text:
charHexStr = f"{ord(x):04x}"
ret += charHexStr
return ret
def hex2str(self, text: str) -> str:
ret = ""
for i in range(0, len(text), 4):
unicodeHexStr = text[i:i + 4]
charStr = chr(int(unicodeHexStr, 16))
ret += charStr
return ret
def encode(self, text: str) -> str:
code = ""
n = 0
for char in self.str2hex(text):
k = (int(char, 16) + n) % 16
code += self.beast[k // 4] + self.beast[k % 4]
n += 1
return self.beast[3] + self.beast[1] + self.beast[0] + code + self.beast[2]
def decode(self, text: str) -> str:
if not (text.startswith(self.beast[3] + self.beast[1] + self.beast[0]) and text.endswith(self.beast[2])):
return "Incorrect format!"
text = text[3:-1] # 去掉头尾标识符
code = ""
n = 0
for i in range(0, len(text), 2):
pos1 = self.beast.index(text[i])
pos2 = self.beast.index(text[i + 1])
k = (pos1 * 4 + pos2 - n) % 16
code += f"{k:x}"
n += 1
return self.hex2str(code)
if __name__ == '__main__':
beast_voice = BeastVoice()
beast_voice.set_beast(['嗷', '呜', '啊', '~']) # 自定义字符集
while True:
choice = input("选择操作: 1.加密 2.解密 3.退出\n")
if choice == '1':
text = input("输入要加密的文本: ")
print("加密结果:", beast_voice.encode(text))
elif choice == '2':
text = input("输入要解密的文本: ")
print("解密结果:", beast_voice.decode(text))
elif choice == '3':
break
else:
print("无效选择,请重新输入!")
一些python自带的函数:
# 返回单个字符的 Unicode 编码值。int类型
ord('你') #20320
# 将整数转换为以 0x 开头的十六进制字符串。
hex(255) # '0xff'
# x:要转换的值(字符串)。
# base:进制数(默认十进制,仅适用于字符串转换)。
# 自动识别进制(base=0)
int("0xff", base=16) # 255
# `0`:指定用零(`0`)填充。
# `4`:总宽度为 4 位。
# `x`:小写十六进制格式。
f"{20320:04x}" # 4f60