一、简述
BugkuCTF 的古典密码题目,复盘一下,依旧 C 语言实现。
题目地址:黄道十二官 - Bugku CTF平台
二、思路概括
1. 识别
看到题目名称"黄道十二宫"或图片中大量古怪符号(几何图形、天文符号、特殊字符),直接锁定为 Z340 密信套路。
2. 重排
按照"跳马步"(Knight's Move)规则,将字符重新组合。通常是 15列宽 的矩阵,采用"向下一行,向右两格"的路径读取。
3. 替换
利用词频分析或爬山算法(Hill-climbing),寻找最符合英文语言规律的字母映射表。
三、解密原理
1. 几何置换原理 (The 1,2-Shift Rule)
Z340 密信最精妙的地方在于它不是横着读或竖着读的。它将 340 个字符排成矩阵,读取规则如下:
-
从左上角 开始。
-
每读一个字符,坐标向下移动 1 行,向右移动 2 格。
-
当触碰到右边界时,取模回绕到左边;当触碰到下边界时,回到顶行。
目的:打破单词的连续性,使得即便看破了符号代表什么字母,也读不出有意义的句子。
2. 同音替换原理 (Homophonic Substitution)
这是为了对抗传统的"频率分析":
-
简单替换:E 永远对应 %。攻击者只要数哪个符号最多,就知道那是 E。
-
同音替换:E 可以随机对应 %, *, #, @。这样每个符号出现的频率都会下降,变得平均,让简单的统计学失效。
破解原理:虽然单个字符频率平均了,但双字符组(Bigrams)或三字符组(Trigrams)(如 THE, ING)的联系依然存在。现代解密工具(如 AZdecrypt)通过计算这些组合的概率对数来强行"拼图"。
3. 编程实现逻辑 (C实现)
在编写时,本质上是在做坐标映射。
公式:Index = (Row * Width + Column)
通过循环控制 Row 线性增长,Column 以步长 2 循环增长,从而将二维的视觉矩阵拉平为一维的逻辑字符串。
通过程序获取到正确排列后使用 AZdecrypt工具将字符密文粘贴进去Solver解密即可
AZdecrypt工具可以在GitHub下载,下载后解压缩,运行.exe文件直接使用即可
地址:https://github.com/doranchak/azdecrypt
正确密文:
%%>%,,@3*
,#(#0+@#+
,@)8@7@*7
@@1#5&8=,
*9@=)#6#7
>0#7%%8$+
@-#5?*13@
?7-+(^(*=
=$$1*=+#=
=^4~@)8%=
%=0,*&*,+
8*1*1>@#)
8@76%=@%6
%,,?#1(%1
5@(#>%,,,
四、代码
cpp
#include<stdio.h>
main(){
int i,start,r,c;
char str[135] =
{ '%',',',',','@','*','>','@','?','=','=','%','8','8','%','5',',','@','%','#','@','@',
'9','0','-','7','$','^','=','*','@','1','7',',','(','>','(',')','1','@','#','#','-','$',
'4','0','~',',','*','6','?','#','%','#','8','#','=','7','5','+','1','(','*','@','*','1',
'%','#','>',',','0','@','5',')','%','?','%','*','^','=',')','&','>','=','1','%',',','+',
'7','&','#','8','6','8','1','(','+','8','*','@','@','(',',','@','@','@','#','*','=','#',
'$','3','*','#','%',',','#','%','%',',','3',',','*','+','7',',','7','+','@','=','=','=',
'+',')','6','1'};
for(start= 0;start<15;start++){
c = start;
r = 0;
for (i=0;i<9;i++){
printf("%c",str[r*15+c]);
r = (r+1);
c = (c+2)%15;
}
printf("\n");
}
}