兽音译者:一次算法解析与LUA脚本移植记录
前段时间花了几天时间研究了一下兽音译者的算法,成功把它翻译成了lua脚本,记录一下学习的过程。
这个就很有意思,虽然网上现在有很多在线解密的工具,不过我还是想自己搞明白它的算法。于是在Github上找到了兽音译者(兽语翻译)SDK这个仓库,里面有Golang, Python, JavaScript, C#四种语言的算法SDK。
理解算法
我拿着仓库到处嚎大佬,终于找到了破空大佬愿意帮我研究py版本的SDK。
破空花了十五分钟看懂算法
然后花了一个小时给我讲清楚
……淦,我好菜!
总之,在破空老师的辛苦教学下,我终于啃完了py脚本,并且给每一行都加上了注释,有兴趣的可以去我fork的仓库里看看。
简单地说,兽语的加/解密各有两步:
加密
将原文字符串中的每个字符变成16进制Unicode(不含0x),然后堆在一起
- 每个字符转换为16进制 Unicode后会变成2-4位,比如
你
的16进制Unicode是4f60
- 当转换后不足4位的时候,就在前面补上0使其成为4位,如
a
是61
,那就补2个0变成0061
- 每个字符转换为16进制 Unicode后会变成2-4位,比如
将Unicode堆在一起的字符串毎一位进行二次加密,并转换为2个兽语,然后堆在一起输出,完成加密
- 首先需要一个变量
n
,n
是字符的次序-1,比如Unicode堆中的第1
个字符的n
是1-1=0
- 对 Unicode堆中的每个字符
x
视作16进制数字进行计算: x+(n/16的余数)
,然后得到个二次加密的16进制数k
,如果这个数≥16,就-16使其落在0-16- 对k分别做两次计算,输出两个兽语
- 兽语1:
k
除以4
的商 - 兽语2:
k
除以4
的余数 - 得到加密完成的兽语后,在字符串的最开头加上加密字典的第
4
2
1
个字符,在字符串的末尾加上加密字典的第3
个。比如字典{"嗷,"鸣,"啊,"~"}
,那就是~鸣嗷
+兽语
+啊
- 首先需要一个变量
解密
解密就是将以上的加密过程反过来。
- 把兽语转换成16进制Unicode编码堆
- 先将兽语去掉开头结尾的字典,然后每两个字符分隔开,取出来单独算
(兽语I×4)+兽语II)
算出原来加密时的k
- 上一步得到的数减去之前二步加密时加上的
n/16的余数
,这里因为是两个兽语相加,所以要减去2n
,最后得到k
- 如果
k
<0,就+16
,使k
最终落在0-16
范围内
- 第一步得到的
k
就是Unicode码的其中一位了,接下来,把每一组两个的兽语都进行这样的处理,就可以得到原始字符串的16进制Unicode串
- 先将兽语去掉开头结尾的字典,然后每两个字符分隔开,取出来单独算
- 将Unicode串转换为原始字符串
- 将字符串每4个一组拆分
- 将每一组4个字符的16进制Unicode转换为字符串
- 将字符串组合,至此解密完成
LUA移植
为了能让QQ机器人比较方便地实现兽语的加密和解密,我花了两天时间把它翻译成了LUA脚本。不过这个算法其实还不完善,比如换行符并没有做适配,比如没有自定义字典的功能,但是我实在肝不动了,如果有哪位大佬有兴趣欢迎提交pr
1 | -- 加密第一步,字符转16进制unicode的4位数字 |
兽音译者:一次算法解析与LUA脚本移植记录