CTF练题(6)棋盘密码解密

本文介绍了一道棋盘密码解密题目,通过特定网站进行解密操作,并详细解释了解密过程。每两个数字对应一个字母,数字范围为1-5。

借一道题引出棋盘解密,题目详情如下:

(题目来自:青少年CTF训练平台 | 原中学生CTF平台 | 青少年CTF (qsnctf.com)

 题目给予的密文如下:

 解题:

(1)使用棋盘密码解码网站进行解密,网站如下:

棋盘密码在线加密解密 - 千千秀字 (qqxiuzi.cn)

(2)解码结果如下,获得flag:

 棋盘密码

解码图片如下:

该题所使用的是小写字母加密类型,可根据上表使密文中的数字进行对应,从而解出明文。

·特点:

1.密文中每两个数字对应一个明文字母。

2.密文中出现的数字范围为1-5,超出这个范围的数字可能是与明文相同的数字。

下方举个例子:

我要加密的字符串为 " beyondlight" ,在上表中寻找与明文字母对应的数字组合,组合中第一个数字为横坐标,第二个数字为纵坐标,两个数字共同定位明文字符。

获得的加密信息为“1215543433143124222344”。

### CTF 毐盘密码解密脚本 棋盘密码是一种经典的替代加密方法,在CTF竞赛中经常被用来测试选手的密码分析能力。以下是基于Python实现的一个简单棋盘密码解密脚本。 #### 脚本说明 该脚本假设输入是一个标准的5×5棋盘矩阵,其中字母I和J共用同一个位置。如果遇到其他变体(如扩展字符集),可以相应调整代码逻辑[^1]。 ```python def generate_chessboard(key): key = ''.join(sorted(set(key), key=lambda x: key.index(x))) # 去重并保留顺序 alphabet = 'ABCDEFGHIKLMNOPQRSTUVWXYZ' # I/J共享同一格 chessboard = [] for char in key + alphabet: if char not in chessboard and char.isalpha(): chessboard.append(char.upper()) matrix = [chessboard[i:i+5] for i in range(0, len(chessboard), 5)] return matrix def decrypt(ciphertext, chessboard): plaintext = '' pairs = [(ciphertext[i], ciphertext[i+1]) for i in range(0, len(ciphertext)-1, 2)] for pair in pairs: row1, col1 = find_position(pair[0], chessboard) row2, col2 = find_position(pair[1], chessboard) if row1 == row2: # 同一行 new_col1 = (col1 - 1) % 5 new_col2 = (col2 - 1) % 5 plaintext += chessboard[row1][new_col1] + chessboard[row2][new_col2] elif col1 == col2: # 同一列 new_row1 = (row1 - 1) % 5 new_row2 = (row2 - 1) % 5 plaintext += chessboard[new_row1][col1] + chessboard[new_row2][col2] else: # 不同行不同列 plaintext += chessboard[row1][col2] + chessboard[row2][col1] return plaintext def find_position(character, chessboard): for row_index, row in enumerate(chessboard): if character in row: return row_index, row.index(character) if __name__ == "__main__": key = input("请输入棋盘密码的关键字:").upper() ciphertext = input("请输入待解密的密文:").replace(' ', '').upper() chessboard = generate_chessboard(key) print(f"生成的棋盘如下:\n{' '.join([''.join(row) for row in chessboard])}") decrypted_text = decrypt(ciphertext, chessboard) print(f"解密后的明文为:{decrypted_text}") ``` #### 关键点解释 1. **棋盘生成** 使用关键字`key`生成一个去重且有序的5×5棋盘矩阵。剩余未使用的英文字母按ASCII顺序填充至棋盘中[^1]。 2. **解密过程** 密文中每两个字符组成一对,通过查找其在棋盘中的行列坐标来决定如何移动: - 如果在同一行,则向左移动一位; - 如果在同一列,则向上移动一位; - 如果既不在同列也不在同一行,则交换两者的列索引[^1]。 3. **边界处理** 当移动超出棋盘范围时,应循环回到另一端。例如,第0列减1会变为最后一列。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值