LLL在密码学中是一个非常好用的工具。
我们知道格对于密码学分析有着极其重要的意义 对于一个方程组,如果我们能够证明它的解是格中的一个短向量,那么,我们就可以利用格来绕过传统的解方程方法,转而使用LLL来直接获得该解。
这篇文章主要讨论的是,假设我们从问题中抽象出了一个线性方程组,那么我们可以如何进行求解
一、使用LLL寻找一个多元线性方程的解
假设我们从某个问题中获得了方程:
a0x0+a1x1+...+anxn=sa_0x_0 + a_1x_1 + ... + a_nx_n = sa0x0+a1x1+...+anxn=s
并且我们确信,我们所要找的解很小。
那么我们可以选择这样的构造这样的基:
$\mathbf{B} = \begin{pmatrix} \mathbf{I} & k\mathbf{a} \ 0 & -ks \end{pmatrix} $
其中,a\mathbf{a}a代表列向量(a0 a1 ... an)T(a_0\ a_1\ ...\ a_n)^T(a0 a1 ... an)T
注:每一行为一个基向量
这样构造之后,我们就会 ...
GNU ZIP
linux中,tar.gz是一种常见的文件后缀。
其中tar就代表“打包”,gz代表Gzip压缩。
tar
打包是对文件的一种很简单的拼接(但是加入了一些元数据),将零散的文件整合在一起方便传输。
这不是我们讨论的重点。
我们重点研究gz是怎么工作的。
gz
全称GNU Zip
它是一种基于DEFLATE算法的压缩方式,大概分为两步。
1. LZ77 (Gzip 的实现版本)
LZ77 的核心思想是 “引用代替重复”。如果一段数据在前面出现过,就用一个“指针”指向过去,而不是重新存储一遍。
核心机制:滑动窗口 (Sliding Window)
Gzip 维护一个 32KB 的滑动窗口,分为两部分:
历史 (History):过去处理过的最近 32KB 数据(“回头看”的范围)。
未来 (Look-Ahead):当前等待压缩的数据流。
工作逻辑
算法不断扫描“未来”的数据,尝试在“历史”中寻找相同的字节序列:
查找匹配:拿着当前的数据去“历史”里搜寻。
Gzip 规定:只有重复长度 ≥ 3 字节 时,才进行压缩。
贪婪匹配:总是尽可能找最长的重复片段。
输 ...
博客很久没有更新了
我们先来讨论一个,在我萌新时代,困扰我很久的问题:RSA低位泄露
比如说RSA的p,原本是512位,但我们已经知晓了它的低400位,我们该如何复原p?
当时我只检索到这个要用到coppersmith算法求小根,但是对当时初入数论模运算都搞不明白的我来说,它过于超纲,拼尽全力无法战胜。
题目
这里随便找了一个题
12345678910111213141516171819202122232425262728293031323334import gmpy2from gmpy2 import *from Crypto.Util.number import *from random import randintfrom gmpy2 import invertfrom scret import flagdef myfunction(num): #立方 output = 0 output=num**3 return outputif __name__ == '__main__': flag_len = len(flag) p, ...
博客很久没有更新了
我们先来讨论一个,在我萌新时代,困扰我很久的问题:RSA低位泄露
比如说RSA的p,原本是512位,但我们已经知晓了它的低400位,我们该如何复原p?
当时我只检索到这个要用到coppersmith算法求小根,但是对当时初入数论模运算都搞不明白的我来说,它过于超纲,拼尽全力无法战胜。
题目
这里随便找了一个题
12345678910111213141516171819202122232425262728293031323334import gmpy2from gmpy2 import *from Crypto.Util.number import *from random import randintfrom gmpy2 import invertfrom scret import flagdef myfunction(num): #立方 output = 0 output=num**3 return outputif __name__ == '__main__': flag_len = len(flag) p, ...
同源(isogeny)
椭圆曲线同源(isogeny)是椭圆曲线曲线理论中的核心概念
它描述两条椭圆曲线之间的特殊映射关系
我们在这里研究它的定义、核心性质,然后讨论它和weil对之间的关系,并在最后附上一道CTF真题
一、定义
设E1和E2是定义在同一域k上的两条椭圆曲线(标准形式为y2=x3+ax+b,其中a,b∈k)设E_1和E_2是定义在同一域k上的两条椭圆曲线(标准形式为y^2 = x^3 + ax+b,其中a,b\in k )设E1和E2是定义在同一域k上的两条椭圆曲线(标准形式为y2=x3+ax+b,其中a,b∈k)
同源(isogeny) 是一个从 E1E_1E1 到$ E_2$ 的映射
ϕ:E1→E2\phi:E_1\to E_2ϕ:E1→E2,满足:
代数性:ϕ\phiϕ由域 k 上的有理函数(分式多项式)定义;
群同态:保持椭圆曲线的加法群结构,即对任意点 P,Q∈E1,有ϕ(P+Q)=ϕ(P)+ϕ(Q)P,Q\in E1,有 \phi(P+Q)=\phi(P)+\phi(Q)P,Q∈E1,有ϕ(P+Q)=ϕ(P)+ϕ(Q);
非平凡性:不将所有点映射 ...
DES(Data Encryption Standard,数据加密标准)是一种经典的对称分组密码算法
它的核心是Feistel 网络结构,加密过程包括初始置换、16 轮迭代、子密钥生成、逆初始置换等关键步骤。
DES 处理的明文和密文均为64 位分组,使用的密钥为64 位(但实际参与加密的有效密钥长度为 56 位,剩余 8 位为奇偶校验位)。加密流程可概括为 5 个核心步骤:
明文经过初始置换(IP);
生成 16 个子密钥(K₁~K₁₆);
对初始置换后的结果进行16 轮 Feistel 迭代;
迭代结束后交换左右两部分;
经过逆初始置换(IP⁻¹) 得到密文。
但是有个巨大的问题,56位的密钥对于现代计算机来说简直脆的像个巧克力蛋筒,早在1998年就被暴力破解。目前DES已经被AES(高级加密标准)取代。
(缅怀)
一、初始置换(IP,Initial Permutation)
IP置换的目的是将64位明文的位进行重排列
我们来看标准IP置换表:
输出位范围(n)
对应输入明文的位(IP [n])
1~16
58, 50, 42, 34, 26, 18, 10, 2 ...
Elgamal加密算法是一种基于离散对数问题的、基于迪菲-赫尔曼密钥交换协议的非对称加密算法
它的加解密过程还挺简单易懂的
首先我们准备好食材:
一个大素数p、一个Zp∗Z_p^*Zp∗的生成元g、随机选择整数k(0≤k≤p−2)k(0 \le k \le p-2)k(0≤k≤p−2)
然后计算y≡gkmod py \equiv g^k \mod{p}y≡gkmodp
这样子我们记私钥为{k}\{k\}{k} 公钥为{p,g,y}\{ p,g,y\}{p,g,y}
起锅烧水!!
Alice选取一个整数r,并计算如下两个方程
y1≡grmod py_1 \equiv g^r \mod py1≡grmodp (1)
y2≡myrmod py_2 \equiv my^r \mod py2≡myrmodp (2)
这样做就把m隐藏在y2y_2y2中
Alice再把y1 y2y_1\ y_2y1 y2发送给Bob
不难发现加密过程使用的是公钥{p,g,y}\{ p,g,y\}{p,g,y}
Bob还原m的过程也非常简单
将y≡gkmod py \ ...
a
MOV 攻击是 1993 年 Menezes,Okamoto 和 Vanstone 三人提出的一种攻击椭圆曲线离散对数问题(ECDLP)的方法,主要思路是利用双线性配对将椭圆曲线上的离散对数问题转化为有限域上的离散对数问题进行求解。
MOV攻击有效的条件
MOV攻击是否有效,取决于椭圆曲线的嵌入度
嵌入度是一个我们还没见过的概念
在密码学中,嵌入通常指的是将一个数学结构(如群、环或域)嵌入到另一个数学结构中。
假设在有限域Fq\Bbb{F}_qFq上有一条椭圆曲线EEE, E(Fq)E(\Bbb{F}_q)E(Fq)表示椭圆曲线EEE上的Fq\Bbb{F}_qFq - 有理点构成的群
嵌入度是满足椭圆曲线群阶的最大素因子NNN整除qm−1q^{m}-1qm−1的最小正整数m
(这里N其实代表阶最大的子群)
即对于给定的椭圆曲线E和子群阶N,嵌入度k是使得椭圆曲线群中阶为N的子群能够嵌入到有限域Fqk\Bbb{F}_{q^k}Fqk中的最小指数。
嵌入度越小MOV攻击越容易生效,但这里的小并没有严格的标准。因为MOV攻击核心是要向嵌入有限域Fqk\Bbb{F}_{q^k}Fq ...
ECDSA(Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法)是一种基于椭圆曲线密码学(ECC)的数字签名标准,用于验证数据的完整性(未被篡改)、真实性(确实来自发送方)和不可否认性(发送方无法否认发送行为)
它相比于RSA等签名算法,密钥长度更短,计算效率更高,因而得到广泛应用。
核心流程
ECDSA的核心流程分为密钥生成、签名生成和签名验证三个阶段
需要预先约定一条椭圆曲线E(记其模数为n)、基点 G
1.密钥生成
私钥:选择整数 d,满足$ 1<d<n−1$(n 为基点 G 的阶)。
公钥:通过点乘计算$ Q=d⋅G$(Q 是椭圆曲线上的点,与私钥 d 一一对应)。
!!私钥应当严格保密!!
2. 签名生成(发送方操作)
最终生成的签名的形式为(r,s)(r,s)(r,s)
计算消息msg的哈希值: h=Hash(msg)h = Hash(msg)h=Hash(msg),取h的整数形式(如果过长,通常阶段至与n同长)
生成随机整数k,满足1<k<n−11<k<n-11<k&l ...


