0%

破解兽音(部分)

今天一个学弟拿了个有点意思的东西来给我看,问我知不知道原理,所以来试着破解一下,记录一下过程。

开始

网址就不给了,自己去网上搜兽音译者。

首先既然是研究,不是整活,那就先把兽语的字符表换成0123,这样方便观察。

然后我们先乱输以及留空输入,发现兽语的格式是310{一些其他东西}2的格式,所以我们后面研究的时候就默认去掉开头的310和结尾的2

我们先用最简单的ascii码表来做些实验,先随便选取一个a,试出来是00012010。然后先来试试它是不是简单的替换,我们再输入aa,发现变成了
0001201010113020,接下来多试几次发现有循环节

1
2
3
4
5
6
00012010
10113020
20210030
30311000
00012010
......

每4个一循环,但是可以发现第2、4、6、8列是不变的,1、3、5、7列会随着位置递增

然后再输入bbbb测试

1
2
3
4
00012011
10113021
20210031
30311001

发现每列的规则跟aaaa的一样,奇数列递增,偶数列不变,所以后续就只取第一个位置的字母来研究。

先用26个小写字母来测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
00012010
00012011
00012012
00012013
00012020
00012021
00012022
00012023
00012030
00012031
00012032
00012033
00012000
00012001
00012002
00012103
00012110
00012111
00012112
00012113
00012120
00012121
00012122
00012123
00012130
00012131

经过观察,前5位都一样忽略,接下来从右往左逐位观察:

  1. 符合一般的递增和进位顺序
  2. 符号被映射为了[1,2,3,0],这一列被+1了,或者说+3就可以变回一般顺序
  3. 比较特殊,在第一第二位02->03时+1。
  4. 只知道能从1->2,不知道什么多少进位

所以目前应该可以做出ascii的加密解密了,把顺序改为从左往右的话,对于字符m,在pos位置,有

  1. (0+pos)%4
  2. 0
  3. (0+pos)%4
  4. 1
  5. (m/84+1+pos)%4
  6. (m/16+2)%4
  7. ((m-1)/4+1+pos)%4
  8. (m-1)%4

接下来写个简单的C语言程序来加密吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
void encrypt(char m,int pos){
int c[8];
c[0]=(0+pos)%4;
c[1]=0;
c[2]=(0+pos)%4;
c[3]=1;
c[4]=(m/84+1+pos)%4;
c[5]=(m/16+2)%4;
c[6]=((m-1)/4+1+pos)%4;
c[7]=(m-1)%4;
for(int i=0;i!=8;++i){
printf("%d",c[i]);
}
}
int main(){
char str[100];
scanf("%s",str);
printf("310");
for(int i=0;str[i];++i){
encrypt(str[i],i);
}
printf("2\n");
return 0;
}

结束

其他编码的如果以后我还想得起来的话再弄吧,明天要考密码学了。