从一道CTF题目学习Tanner图和LDPC

本文概述了Tanner图在低密度校验码(LDPC)中的应用,介绍了其结构特点,包括循环和围长的概念,以及如何通过Tanner图表示校验矩阵。通过SUSCTF2022的CTF题目实例,展示了如何利用Tanner图来解析校验矩阵并进行编码验证。

概述

  Tanner图是由Mr Tanner在1981在论文中提出来的,是研究低密度校验码的重要工具。
  Tanner图表示的是 LDPC 的校验矩阵。Tanner图中的循环是由图中的一群相互连接在一起的顶点所组成的。循环以这群顶点中的一个同时作为起点和终点,且只经过每个顶点一次。循环的长度定义为它所包含的连线的数量;而图形的围长,也成为图形的尺寸,定义为图中最小的循环长度。
  Tanner图包含两类顶点: n个码字比特顶点(称为比特顶点),分别与校验矩阵的各列对应; m个校验方程顶点(称为校验节点),分别与校验矩阵的各列对应。校验矩阵的每行表示一个校验方程,每列代表一个码字比特。 如果一个码字比特包含在相应的校验方程中,那么就用一条连线将所涉及的比特节点和校验节点连起来,所以Tanner图中的连线数与校验矩阵中的1的个数相同。 比特节点用圆形节点表示,校验节点用方形节点表示。

CTF题目示例

题目来源:SUSCTF2022 Misc Tanner
下载题目,打开文件,是一个图片。请添加图片描述
根据Tanner图,写出校验矩阵:
在这里插入图片描述
发现图片提示
在这里插入图片描述
低密度奇偶校验码图(LDPC码)本质上是一种线形分组码,它通过一个生成矩阵G将信息序列映射成发送序列,也就是码字序列。对于生成矩阵G,完全等效地存在一个奇偶校验矩阵H,所有的码字序列C构成了H的零空间 (null space),即H*CT=0,其中CT为C的转置。
编写计算脚本:

import numpy
import string
import hashlib

H1 = [[1, 1, 1, 1, 0, 0
### CTF题目解题思路分析 #### Base64 编码与解码 Base64 是一种常见的编码方式,用于将二进制数据转换为可打印字符。在 CTF 题目中,通常需要对给定的数据进行多次 Base64 解码以恢复原始信息。Python 的 `base64` 库提供了便捷的方法来实现这一功能。 ```python import base64 encoded_data = 'SGVsbG8gd29ybGQ=' # 示例 Base64 数据 decoded_data = base64.b64decode(encoded_data).decode() # 进行解码并转为字符串 print(decoded_data) # 输出 Hello world ``` 如果遇到嵌套的 Base64 编码,则可以通过循环逐步解码[^1]。 --- #### URL 编码与解码 URL 编码是一种将特殊字符替换为其十六进制表示的方式,以便它们可以在 URL 中安全传输。CTF 题目可能要求解析经过 URL 编码的参数或路径。Python 提供了 `urllib.parse.unquote` `urllib.parse.quote` 方法来进行编解码操作。 ```python from urllib.parse import unquote url_encoded_data = '%E4%BD%A0%E5%A5%BD' # 示例 URL 编码数据 decoded_url = unquote(url_encoded_data) # 将其解码为 UTF-8 字符串 print(decoded_url) # 输出 你好 ``` 对于复杂的 URL 结构,建议逐层拆分并逐一解码[^2]。 --- #### JSON 处理 JSON 文件常被用来存储配置、日志或其他结构化数据,在某些 CTF 题目中可能会隐藏敏感信息。通过 Python 的 `json` 模块可以轻松加载修改 JSON 数据。 ```python import json json_string = '{"name": "Alice", "age": 25}' # 示例 JSON 数据 parsed_json = json.loads(json_string) # 加载 JSON 数据到字典 modified_json = {"name": parsed_json["name"], "secret_key": "flag"} # 修改 JSON 数据 new_json_string = json.dumps(modified_json) # 转回 JSON 字符串 print(new_json_string) # 输出 {"name": "Alice", "secret_key": "flag"} ``` 需要注意的是,部分题目可能存在恶意构造的 JSON 数据,应小心处理潜在的安全风险[^3]。 --- #### Crypto 库中的 `bytes_to_long` 函数 `bytes_to_long` 是 PyCryptodome 或其他加密库中常用的一个工具函数,它能够将字节数组高效地转化为整型数值。此方法广泛应用于 RSA 密钥生成以及大数运算场景下。 ```python from Cryptodome.Util.number import bytes_to_long byte_array = b'\x01\x02\x03' long_value = bytes_to_long(byte_array) print(long_value) # 输出 66051 ``` 当面对 RSA 类型的挑战时,利用该函数可以帮助快速完成密文向明文转化的过程[^4]。 --- #### 综合应用实例 假设有一道综合性 CTF 题目如下: 1. 输入是一个 Base64 编码后的字符串; 2. 对其解码得到一段 URL 编码的内容; 3. 再次解码获得一个 JSON 格式的文件; 4. 使用其中提取出的信息作为 AES ECB 模式下的秘钥去解开最终密码。 以下是解决方案框架代码: ```python import base64 from urllib.parse import unquote import json from Cryptodome.Cipher import AES def decrypt_aes_ecb(key, ciphertext): cipher = AES.new(key, AES.MODE_ECB) plaintext = cipher.decrypt(ciphertext) return plaintext.rstrip(b"\x00") # 去除填充零 # Step 1: Decode Base64 data_base64 = 'aGVsbG8=' step_1_result = base64.b64decode(data_base64) # Step 2: Unquote URL Encoding step_2_result = unquote(step_1_result.decode()) # Step 3: Parse JSON Data json_obj = json.loads(step_2_result) aes_key_hex = json_obj['key'] # Convert Key from Hex to Bytes aes_key_bytes = bytes.fromhex(aes_key_hex) # Decrypt with AES ECB Mode ciphertext = bytes.fromhex('your_ciphertext_here') plaintext = decrypt_aes_ecb(aes_key_bytes, ciphertext) print(plaintext.decode()) ``` 以上脚本展示了如何串联多个技术点解决实际问题[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2ha0yuk7on.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值