熵密杯复现
熵密杯2024复现
1.puzzle1
题目
1234567891011121314151617181920212223242526272829def encrypt_message(message, key): # 添加前缀 message_with_prefix = MSG_PREFIX + message message_bytes = message_with_prefix.encode('utf-8') message_len = len(message_bytes) num_blocks = message_len // 16 + 1 blocks = [message_bytes[i * 16:(i + 1) * 16] for i in range(num_blocks)] # 进行0填充 blocks[-1] = blocks[-1].ljust(16, b'\x00') encrypted_blocks = [] k = key # 加密每个分组 for block in...
哈希长度拓展攻击
哈希长度拓展攻击
1.什么是MAC?
MAC就是Message Authentication
Codes,即消息验证码
🔐 MAC的核心作用
认证性(Authenticity):确保消息的发送者是声称的人,即消息确实是由合法的发送者生成。
完整性(Integrity):验证消息在传输过程中是否被篡改或损坏。
为了实现这些功能,发送者使用一个秘密密钥和MAC算法生成一个认证标签(MAC值),这个标签随消息一起发送。接收者也拥有同样的密钥,可以用相同算法重新生成MAC值。如果重新计算的值和收到的值一致,就可以确认消息没有被改动。
这个标签也叫做tag
MAC系统包含以下三个算法
A key
generation algorithm selects a key from the key space uniformly at
random.
A MAC generation algorithm efficiently returns a tag given the key
and the message.
A verifying...
reverse常见函数
逆向积累
1.字符串相等
这里i64相当于LL
0i64=0LL,1i64=1LL
12345678910111213141516__int64 __fastcall equal(_QWORD *a1, _QWORD *a2){ __int64 v2; // rbx int v4; // ebx unsigned __int64 i; // [rsp+28h] [rbp-58h] v2 = sub_425120(a1); if ( v2 != sub_425120(a2) ) return 0i64; for ( i = 0i64; sub_425120(a1) > i; ++i ) { v4 = *(_DWORD *)sub_425200(a1, i); if ( v4 != *(_DWORD *)sub_425200(a2, i) ) return 0i64; } return 1i64;
1234__int64 __fastcall sub_425120(_QWORD...
reverse_note
1.什么是PE?
PE( Portable Execute)文件是Windows下可执行文件的总称,常见的有
DLL,EXE,OCX,SYS 等。它是微软在 UNIX 平台的
COFF(通用对象文件格式)基础上制作而成。最初设计用来提高程序在不同操作系统上的移植性,但实际上这种文件格式仅用在
Windows 系列操作系统下。PE文件是指 32
位可执行文件,也称为PE32。64位的可执行文件称为 PE+ 或
PE32+,是PE(PE32)的一种扩展形式(请注意不是PE64)
总而言之就是可执行文件
一个文件是不是可执行文件和后缀名无关
在Linux中,ELF是可执行文件
image-20250627223959874
PE文件的结构包括
DOS头,NT头,节表
以及 具体的节**
dos头的作用
兼容性:
当PE文件在DOS系统下运行时,DOS头中的代码会执行,通常显示一个错误信息(例如:"This program cannot be run in DOS...
Coppersmith归纳
归纳一下Coppersmith
1.Background
我们可以利用LLL算法来求解模多项式问题
比如我们想要求解
这个模多项式方程,这个是困难的,我们可以考虑构造整数上与之同解的方程,使得
我们知道当f(x)的系数比较小的时候,这个模多项式方程有可能变成多项式方程,这就可以考虑使用LLL算法求得约化基
注意到 而且同解,沿着这个思路
也是同解的,然后我们把h进行线性组合,寄希望与他们的系数可以相互抵消,使得系数绝对值变小
先考虑
引理Howgrave-Graham
设h(x)是一个有d个单项式的多项式,如果满足 那么,可以在整数集上求解
由 根据柯西不等式 而 那么
所以
根据上面这个,我们来构造 这个模数没统一,我们不妨固定为m吧,那这样的话,前面构造就得改
于是有 构造 只需令 那怎么找到这样的g呢
我们用的系数向量造格子
寻找满足的向量
不妨令LLL约化得到的b_1为这个向量,那么 只需令 未完待续,但其实根据前面这个引理,已经能得到很多东西了
递归和迭代的区别
...
二叉树
二叉树
1.二叉树的抽象类型
12345678struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} };
一个二叉树结点包含值,左子树和右子树
2.二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的
层序遍历 。...
外排序
...
苦读密码学引论--hash
HASH函数
hash函数就是将映射到的函数,即将任意长度的比特串映射为n-bits
即 其中H叫做像,M是原像
一个好的hash函数需要满足一下属性
1.抗原像攻击
给定H,找到X,使得h(X)=H是困难的
2.抗第二原像攻击(弱抗碰撞)
给定X,找到X'使得h(X)=h(X')是困难的
3.抗碰撞攻击
找到任意两个X和X',满足h(X)=h(X')是困难的
(任何一个第二原像都不存在)
为什么抗碰撞性更强?
如果一个哈希函数是抗碰撞的,那么它必然也是抗第二原像的。
理由: 如果攻击者能对一个给定的 x
成功进行第二原像攻击(找到 x' 使得
H(x') = H(x)),那么他实际上就找到了一个碰撞对
(x, x')。所以,抗碰撞失败必然导致抗第二原像失败。
反之则不然!一个哈希函数可以是抗第二原像的,但却不抗碰撞。
理由: 攻击者可能无法为某个特定的、随机的
x 找到碰撞伙伴
x'(满足抗第二原像),但他可能通过精心构造的方法找到任意一对特殊的消息
y 和 y'(y 和 y'
都不是那个特定的...
H&NCTF2025-crypto
H&NCTF
1.lcgp
常规的LCG问题,
观察函数generate
123def generate(self): self.seed = (self.a * self.seed + self.b) % self.m # %代表取余运算 return self.seed
输入seed,获得一个新的seed 接着循环了5次,产生了5次种子
换而言之,我们需要利用这5个种子,求出一开始的种子
不妨设,一开始的seed为x1,然后我们写成数列的形式 已知求 接着来看算法的关键
这里面a,b,m都是未知的,b好处理,因为在常数的位置,两个式子相减就能消掉
考虑 这时候,我们以作为一个新数列,那么这时候只剩下两个未知数了
设
那么
于是构造了一个等比数列
说到等比数列,等比中项就是一个有趣的性质,那么,对于这个同余的等比数列,是否有着等比中项呢,可以一试
a消失了,那么此时,只剩下m这一个未知数
把同余式写成等式 ...