学习了史济怀的《复变函数》第2~4章。第五章没细看,因为个人需求是会洛朗展开和留数定理去计算就行,而这两个东西早就知道了,因此就看了Borcherds的课,跟着用草稿纸去算一算特定的积分。
笔记有很多习题空着了,部分内容也跳过了。不过确实是写了自己思考的一些东西… 也许有一天再用复分析的时候干脆讲一讲,再完善一下这些笔记。还有二次剩余分布问题也可以讲一讲。
感觉数位板还是适合手头有纸质的初步笔记,然后边讲边写。直接对着电脑看效果差一点。
椭圆曲线密码学实际上涉及到不少高深的数学知识。2022年10月在Nepnep战队做了一次线上分享,听众还有其他对密码学感兴趣的朋友以及geek学院的朋友等。主要内容是代数学基础回顾、射影几何基础以及GTM 106前三章的部分内容。
观看视频时请打开弹幕,其中提示了一些错误
$E/K$和$E(K)$的定义,以及两者之间的区别:
自然地,$E=E(\overline{K})$.
注意扭点群的定义、Weil对的反对称性等
上述条目的2/3可以在黎曼面相关的书籍中学到(书籍见后)
B站视频合集:https://www.bilibili.com/video/BV15V4y1V71d
2022年10月分享手写稿:https://pan.baidu.com/s/1b_Whla_qhKVqu2KyLz6tCQ?pwd=hxd7
可以看下Weil对和Tate对是怎么用除子定义的。
Paper from JoC 2004: The Weil Pairing, and Its Efficient Calculation
JoC,密码界最强顶刊,其含金量甚至大于顶会。干脆来看这篇学Weil对
Elliptic Curves Number Theory and Cryptography
前言中说明了适用于密码学的学习章节,不过isogeny那章也可以看一看,是椭圆曲线同源密码的那个同源。
安全性问题比如Ladder, Twist,MOV攻击,FR约化攻击… Weil Descent Attack就很难了,我到现在都感觉自己还差不少才能看懂。GTM106也只讲到2-descent。Milne的Elliptic Curves讲义可能有Weil restriction。
椭圆与超椭圆曲线公钥密码的理论和实现
难得的一本中文书,各种高级的攻击在里面都有写…
双线性对的应用,如:双线性对的三方一轮密钥协商,各种IBE、ABE方案… 双线性对曾经是密码学中最强大的数学工具,用它可以实现一些功能非常强大的、让人意想不到的密码学功能。
Mathematics of Isogeny Based Cryptography
关注同源,谢谢!
Fulton的代数曲线
入门古典代数几何用,有配套讲义。
Elliptic Curves Number Theory and Cryptography
比GTM106简单些。
GTM 106 The Arithmetic of Elliptic Curves
后半要会一些代数数论才能看,有网上课程
Algebraic Curves and Riemann Surfaces by Rick Miranda
如果想绕过代数几何直观地搞懂视频中的一些结论,应该看这个紧黎曼面的内容。非常友好的书,稍微学一些点集拓扑、基本群、微分流形,再看一个基础的单变量复变函数课就可以读的很顺畅。Geek学院的Ultra做过一次紧黎曼面的沙龙,推荐看视频配着书,把握住重点。
椭圆与超椭圆曲线公钥密码的理论和实现
感受一下椭圆曲线密码学攻击中的各种数学吧,你能看到De Rham上同调,同调群,Brauer群、Weil restriction等等…
不过有些地方作者似乎试图写得初等一点可能乍一看看不出来,例如Smart Attack实际上用到GTM 106第五章的一些知识(这还被写在了“一些初等的攻击”那一章…)。
感谢@朱子阳的热心解惑。
另外这次分享中有几次挂黑板,也有很多很多没讲到位的地方。感谢各位听众的理解与支持!
]]>后来跟shallow师傅讨论了一下,又看了下当时的WP发现有很多细节没说,并且有点小问题。因此现在补充一下。
Carmichael定理, $\mathbb{Z}_{N}^{\ast}$ 的阶, Minkowski定理, Gauss reduction算法
(2023.8 补充): 不知道为什么之前自己写得那么复杂,实际上在群同构$\mathbb{Z}_{N}^{\ast} \cong \mathbb{Z}_{p}^{\ast} \times \mathbb{Z}_{q}^{\ast}$ 的视角下Carmichael定理是很容易看出来的。取模$p$原根$g_1$,模$q$原根$g_2$,$\mathbb{Z}_{N}^{\ast}$ 的元素在同构下对应某一个$(g_{1}^{x}, g_{2}^{y})$,于是他们的阶显然整除$\lambda(N)$。
以下思路过于繁琐,不过这里仍然保留一下。
WP中已经说明本题 $m^{1-e} \pmod n$ 比较小,这意味着$1-e$以极大的概率接近 $\text{ord}(m)$的倍数 ,据此我们可以推断出$1-e$的形式。现在关键问题是 $\text{ord}(m)$ 应该是什么样的形式?当时在这个问题上,很多师傅都翻车了。当时一位师傅做这个题的时候把 $\text{ord}(m)$ 想成了$\phi(N)$。那么 $\text{ord}(m)$ 实际上应该是什么样的形式呢?
先说结论:$\text{ord}(m)$ 整除 $\lambda := \lambda(N)=\text{lcm}(p-1, q-1)$
定理:设 $G$ 是有限Abel群,记 $ o = \max_{a \in G}{\text{ord}(a)} $ ( $o$ 为 $G$ 中阶最大的元素的阶 ),那么
为了说明 $ m^{\lambda} \equiv 1 \pmod{N} $,考虑群 $G = \mathbb{Z}_{N}^{}$. 这是一个有限交换的乘法群。假设$\mathbb{Z}_{N}^{}$中阶最大的元素是 $g$ ,考虑中国剩余定理。那么想让 $\text {ord}(g) = o$ 尽量最大的话,最好的可能就是 $g$ 同时是模 $ p $ 和 模 $ q $ 的原根。这时 $o = \text{lcm}(p-1, q-1) = \lambda$.
如果不存在一个元素同时是模 $ p $ 和 模 $ q $ 的原根,那么 $o$ 也一定整除 $\text{lcm}(p-1, q-1)$.
_不过根据原根的数量这种情况的概率应该很低?也可能根本不存在这种情况?我不清楚。好像有限Abel群结构定理能说明存在性,懒得想了。_
总之, $o$ 一定整除 $\lambda = \text{lcm}(p-1, q-1)$.
结合上个定理,可以推出以下定理。
Carmichael定理: 设 $N = p \cdot q$,其中 $p, q$ 皆为素数。设 $\lambda = \text{lcm}(p-1, q-1) $,则
因此 $\text{ord}(m)$ 整除 $\lambda$ ,因此 $\text{ord}(m)$ 也必然整除 $\phi(N)$
在challenge.sage
中结合Description.md的提示发现 get_e()
是从secret中import的没有给出,但是 $e$ 的值是给出的,猜测这个 $e$ 可能有特殊形式所以不能给出。
分析出attack_experiment.sage
攻击原理,写出使用的格。
再根据参数满足理论上的攻击条件使用Minkowski定理(上界),分析出 $e$ 约等于 $\text{ord}(m)$ 的倍数,然后开始找 $e$ 和 $\phi(N)$ 的关系。
计算 $N/e$ 发现非常接近7,因此 $\phi(N)/e$ 也非常接近7。
据此对$\phi(N)$进行爆破,然后用 $\phi(N)$ 分解 $N$ 。
attack_experiment.sage
代码,推出其攻击原理如下:可见 $m^{1−e} \mod n$ 的量级最大为 $\sqrt{n}$ ,然而很难找到一般的 $e$ 来满足这一点.
可以猜测出 $1−e$ 约等于 $\text{ord}(m)$ 的倍数。考虑找 $e$ 和 $\phi(N)$ 的关系。计算$N/e$发现很接近7,于是 $\phi(N)/e$很接近7。因此 $e= \phi(N)/7 - b$, 并且 $b$ 很小。
对 $b$ 进行穷举。已知 $ \phi(N) = (p-1)(q-1) $ 分解 $N=pq$ 是容易的(中学数学),用 $n \mod p = 0$ 来判断当前分解是否正确即可。之后再做常规RSA解密就好了。
get_e()
没给出,可能有一点脑洞。应该写得再明白一些,e是为了试图满足原攻击条件的特殊的e。
应该直接告诉大家,x在这里等于1。当时是想让大家不看论文并根据attack_experiment.sage
的代码逻辑,自己推出论文中那个攻击的原理。但是CTF中大家无疑都是会去看论文的…
附件中Description.md
中的提示还是有点少,应该写明白预期解不是基于格的攻击。
WP的一个小问题:这道题的 $\phi(n)/7$ 是 $\text{ord}(m)$ 吗?不可能,注意到 $\lambda$ 是偶数,实际上两者是倍数关系。但是当时太懒就少打了几个字。
正解的思路太复杂,招新赛出这个有点难了。
懒得写方案,因为到处都能找到。直接看(知乎)Paillier半同态加密:原理、高效实现方法和应用。
(2023.8) 之前写了一大段,不过因为跟COA_RSA那篇的内容重复,所以现在删掉了
见本博客的另一篇文章:NepCTF2022 - COA_RSA解读
待补充…
以下方案与原论文有出入。我这里写的是 section 4.1中,$s=1$时的情况。
Compute $n = pq \ , \ \lambda = \text{lcm}(p-1, q-1) = (p-1) (q-1) / 2$
Choose $g = n+1$
Let $|n|$ denote the bit length of n.
Note that here we assume $m \in \mathbb{Z}_{n}^{*}$ ( i.e. $m < n$)
Note that here we assume $m \in \mathbb{Z}_{n^2}^{}$ . *This is the case in the original paper, but it’s far more complicated then Dec1…
这种解密方案似乎没有在实际中应用,并且细节比较繁琐,这里就不写了。
图片来自 A Graduate Course in Applied Cryptography(Version 0.5)
这道题就是在让大家求解椭圆曲线上的DDH问题(ECDDHP)。
由于题目中的BLS曲线是配对友好曲线,所以可以计算双线性对。
双线性对满足 $e(aG, bG) = e(G, abG)$
这就给了我们一个解DDHP的后门。因此如果随便选一个椭圆曲线点群,ECDDH假设通常是不成立的,并且攻击方法很简单:看等式$e(aG, bG) = e(G, cG)$ 是否成立。个人认为这是一个很优美的做法。
1 | # sagemath 9.5 |
其实是非预期解,不过测题的时候队里有其他师傅想到了,这个思路也是直击DDH问题中的’Decisional’ 。
题目中点G的阶为
做法类似Pohlig-Hellman算法中使用的原理,不过我们不用算出a, b和c,而是在模3, 模11, 模10177等的意义下计算出a,b和c。再对应考察同余式是否成立: $ab \equiv c \pmod{3}$ $ab \equiv c \pmod{11}, … $ 。如果成立那么大概率有$ab = c$。打印出来看看flag对不对就行了。
1 | # sagemath 9.5 |
早就想把密码理论与密码攻击相结合出一个题目,之前想到DDH,上面写嵌入度较低的椭圆曲线上DDH假设不成立。于是我找了一条BLS曲线来出这道题,题面非常简单就是进行DDH Game。DDH假设是一个很重要的话题,Game则是密码理论中的security game,双线性对也是很重要的密码学工具。不过题目难度比较低,希望能够抛砖引玉。
根据交换图,两个明文先做加法再加密,其结果与先加密再做密文乘法相同。因此CatCrypto是一个同态加密,具有加法同态性。
其实这道题是Paillier-DJN算法,Paillier的一个变种。见Paillier半同态加密:原理、高效实现方法和应用
1 | from Crypto.Util.number import long_to_bytes |
因为是Cat CTF,并且说出题可以不限于传统的CTF思路,所以想涉及一些猫论(category theory, 范畴论)。找了一些资料来看:Categorical & Diagrammatic methods In Cryptography and Communication
确实有一些人提出范畴论与密码学结合,想法很有意思(比如p35~36的内容)。但这些想法似乎还没有太多应用。并且我自己对范畴论了解也很有限,也没试过自己编造一个密码方案。一时间想不到怎么用这个出一道题。
正好想到Craig Gentry(第一个全同态方案的提出者)给出的用交换图概括同态加密,交换图可以算是范畴论的东西,并且在密码学中也还是经常能看到的。于是干脆来个Paillier-DJN同态加密方案(Paillier的改进方案),给一张交换图来提示同态性。
跨年气氛题,想起Amann的Analysis上有一只猫猫,翻了一会儿找到一个与pi相关的公式。注意到flag示例中 CatCTF{apple} CatCTF{banana}是小写开头英文单词,都是食物,以及题目中提到这是一份礼物,因此提交的flag不是pi而是pie。
有四种解法
法一:直接猜结果是pie
法二:手算,写出arctanx的幂级数展开,然后把x=1带进去
法三:编程算近似值,然后猜
1 | def solve_gift(n=100): |
找到Amann的 Analysis I p389
其实pi=pie也是一种数学文化,3.14那天有一些人会吃派庆祝,因此就把这个题放在了跟数学最相近的crypto里面。出题时感觉应该很自然能想到pie吧,没想到很多朋友因为没有get到所以没做出来…
忘记了这是一种小众文化,出题人随缘在此向各位深表歉意。
]]>参考CTF Wiki即可。
除了CBC的结构需要掌握,还要知道一个很重要的结论:标准的CBC是CPA安全的,但不是CCA安全的。也就是说我们有一些选择密文攻击(Chosen Ciphertext Attack)。
假设我们知道采用的加密算法和IV值,并且我们知道一个明密文对$(P_1||P_2, C_1||C_2)$。假设我们可以控制待解密的$C_1||C_2$。 (这里$A||B$表示两个连续的明/密文分组)
我们可以伪造密文,使得解密后的明文为$P_1||A$。其中第二个明文分组$A$是我们自己随意选择的。这是因为我们有:
如果我们想伪造$P_2’ = A$,我们只需要取$C_{1}’ = C_{1} \oplus P_{2} \oplus A$。可以验证等式$P_{2}’ = D_{K}(C_{2}) \ \oplus \ C_1’$ 成立。因此$C_{1}’ || C_{2}$对应的明文确实是$P_1||A$。
如果我们能控制$IV$和密文值,由于$IV = C_{0}$,我们也有类似的攻击方法。考虑到
那么我们按照上面改$C_1$的方法修改$IV$即可。
Cryptohack有一个CTF题,感兴趣的可以找到它练一下。但是考虑到cryptohack的规则,我不说是哪个。
以下攻击条件和攻击效果两部分基本引用了CTF Wiki - padding oracle attack中的内容。但是我在看CTF Wiki攻击原理部分的时候感觉有一些不清晰的地方,因此我还是自己手推了一下攻击原理。
Padding Oracle Attack 攻击一般需要满足以下几个条件
加密算法
攻击者能力
Padding Oracle Attack 攻击可以达到的效果如下
大思路是根据padding格式推出最后一个字节,然后在此基础上再考虑推出倒数第二个字节…最终发现可以对任意一个密文分组做解密。直接贴手稿图。
采用一些别的padding(例如One and Zeroes Padding)可以防止这个攻击,但是会有一些别的问题。参考:Securing CBC mode Against Padding Oracle Attacks
引用Cryptopals: Exploiting CBC Padding Oracles的Defenses部分
This attack is a chosen-ciphertext attack. It depends on the attacker being able to submit arbitrary ciphertexts to the oracle. As such, you can prevent the attack by authenticating your ciphertexts. You might do this by switching from CBC mode to an authenticated encryption mode like GCM or OCB; alternately, keep CBC mode but start MACing your ciphertexts using something like HMAC.
Removing the oracle would also prevent the attack. However, hopefully the example oracles above gave you some sense of how nontrivial this actually can be in practice. This is a cryptographic problem and it calls for a cryptographic solution; anything less is likely to be fragile and error-prone.
By adding authentication tags and checking them prior to decryption, we guarantee that we’ll be able to reject any attacker-crafted messages without ever decrypting them, preventing us from leaking any information at all about their decrypted contents, padding-related or otherwise.
Cryptohack’s CTF challenges. Symmetry category
According to the rule of cryptohack, I won’t tell you which challenge is it. Sorry about that.
Securing CBC mode Against Padding Oracle Attacks
我vim等工具玩的也不多,而且感觉也没需求(不过这次重装其实就是打N1CTF半截,vscode连不上WSL2,然后WSL2也炸了)。所以不搞花里胡哨的,一切从简..
但是sagemath 10.x版本对我来说很有必要,而apt包管理器目前只能下到9.5,所以sagemath是自己编译的。
默认是装C盘的,上次我C盘空间不足,很折磨。 所以这次选择手动安装。
正确做法是import或者先官方安装 export再import,千万别自己解压缩包然后像下面这样安装!!
先升级Windows11到23H2,否则不方便让WSL2科学上网。这会影响到sagemath高版本的编译。23H2应该很快就发布了,急着用就看这篇的2023.9.19更新
下载WSL2并做安装所需的前置步骤:下载发行版里面选个ubuntu的LTS高版本下载,同时往上翻完成前五步
下载的.appx
文件后缀改为.zip
,架构的.appx
包拖出来再改为.zip
,解压到你想安装的文件夹。然后点击ubuntu.exe
直接装vscode,打开右下角自动提示安装WSL2扩展。下面改xxx文件就可以直接code xxx了。没写权限先chmod,再改回去
Windows上装点东西:设置 WSL 开发环境的最佳做法分步指南。 Windows Terminal 肯定还是要装,别的看着办。
换国内源
安装实用工具(可选):thefuck, ag, …
给WSL2加内存、处理器核心数等等。根据官方文档示例,新建或编辑WSL的全局配置文件内容如下(根据自己电脑的配置自行修改),文件路径为C:\Users\<YourUserName>\.wslconfig
1 | # Settings apply across all Linux distros running on WSL 2 |
其中swapfile
设定的路径所在文件夹必须存在。编辑之后,让WSL2关机再重启才会生效。Powershell wsl --shutdown
关机
官网或直接一句话安装:
1 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
vscode扩展插件装上rust-analyzer。
需要读一些项目代码,既安装了gcc又安装了clang。
目前vscode配上了扩展: call graph(LuoZhihao写的那个)。感觉效果差一些,准备摸索一下用doxygen + codeviz生成call graph。
自己编译sagemath真的很坑,很难装上,基本上得去google group请教sagemath的人。但是用anaconda安装还是不难的。
此处参考sagemath conda安装方法的’Using conda to provide all dependencies for the Sage library’章节
1 | ORIG=https://github.com/sagemath/sage.git |
1 | curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh |
conda install mamba
mamba clean -i
1 | # 可以把sage改成XXX,以后activate时 mamba activate XXX |
1 | ./bootstrap |
1 | sage -c 'print(version())' |
这是密码学常用的抽代知识清单。分成两个部分:基本框架、重要内容。
我在B站上录制了一个课程(建议1.5倍速),2小时即可快速回顾抽代知识:密码学的数学基础:课程简介
几个重要术语:代数结构、子结构、同态、商结构
在线性代数中对应:线性空间、子空间、线性映射、商空间
代数结构 | 子结构 | 同态 | 商结构 |
---|---|---|---|
群 | 子群 | 群同态 | 正规子群->商群 |
环 | 子环 | 环同态 | 理想->商环 |
域 | 子域 | /(同上) | /(同上) |
线性空间 | 子空间 | 线性映射 | 商空间 |
直积(直和)、生成子集对应线性代数中的直和、基。
素域、域的特征
由整环构造域:分式域、$R/M$ ( $PID$ 中 $R/(p)$ )
域的分类:按元素个数分为有限域、无限域,可用特征区分
域的扩张:代数扩张与有限扩张、超越扩张与无限扩张
多项式的分裂域,例如 $\mathbb{R}$ 上 $x^2+1$ 的分裂域,$x^n - 1$ 的分裂域。
有限域的结构:子域格、$\mathbb{F}_q$ 作为向量空间,$\mathbb{F}_q$ 作为分裂域、本原元
一般有限域的结论(与$\mathbb{F}_p$类似):费马小定理、欧拉定理、Wilson定理…
有限域上的运算、元素的表示
本原多项式——LFSR相关理论、周期计算等
我原来的csdn博客:https://blog.csdn.net/qq_42667481
]]>正文请点击阅读更多查看
与同行者从黑暗中走出时,他才发现不知何时手里已拿着一盏灯。其实世界还是一片黑,只不过为了方便自己探路,在某个地方偶然发现了一盏还能点亮的煤油灯拿了起来。就这样,他决定成为一名掌灯人。
点着了灯,便有顺路的人同行。可惜这灯并不强力,当寒风吹来时灯火便摇摇欲坠,于是众人便紧紧的围在一起,以防灯火被寒风吹灭。不过也因为这样,原本就不是很亮的灯只能照亮周围几个身位的距离,因此这队伍也无法壮大。况且,掌灯人听说过有人并不喜欢灯光,甚至会将灯偷偷灭掉,因此他总是戒备着那些在远处,看不清脸上表情的人。
每个人都有自己要走的道路,即使是掌灯的人也不例外。在一个错综复杂的路口,将与众人分道扬镳的。突然,身边的一人拿起一抔雪要将掌灯人手里的灯扑灭。
掌灯人知道自己手里的灯不能承受这袭击。好在,掌灯人毕竟是掌灯人,他及时护住自己的灯,让雪打在了自己身上。
(待续)
]]>理解本文所需的前置背景:
首先我们给出攻击中的假设条件和符号约定。设同一个RSA加密系统中有$\,r\,$个RSA实例共用同一个私钥$\,d\,$,这些实例的公钥分别为$\, \left(e_1,\ N_1\right),\ldots,\left(e_r,\ N_r\right)\,$ 。不妨设$\,N_1,\ldots,\ N_r\,$依次增大,并且由于是同一个系统中的实例,故认为$\, N_1,\ldots,\ N_r\,$具有相同的比特长度,于是有$\,N_1<N_2<\cdots<N_r<2N_1\,$。
由RSA加密的原理可以得到如下$\,r\,$个方程:
对任意的$\,i\,$,设$\, e_i<\varphi\left(N_i\right)\ ,\ \ \varphi\left(N_r\right)=N_i-s_i\,$.我们假定生成$\, N_1,\ldots,\ N_r\,$ 的素数具有相同的比特长度,则${\, s}_{i\ }<3N_1^{1/2}\,$ 。并且最关键的,假设以下命题成立:若$\, v\,$是格$\, \mathcal{L}\,$中满足Minkowski’s bound的一个向量,则$\, \pm v\,$为格中所有的非零最短向量,除此以外没有其他向量范数为$\,\lambda_{1}\!\left(\mathcal{L}\right)\,$ 。
设$\, M=\left\lfloor N_r^{1/2}\right\rfloor\,$ ,由之前假设中的等式可得方程组
下面将方程组写为矩阵形式。记
则有$\, x_r\mathcal{B}_r=v_r\,$。注意到$\, \mathcal{B}_r\,$的行向量组生成了一个$\, r+1\,$维的格$\, \mathcal{L}\,$,而$\, v_r\in\mathcal{L}\,$。那么由假设可知,当不等式$\left|v_{r}\right| < \sqrt{r+1} \det(\mathcal{L})^{1 /(r+1)}$ 成立时(即满足Minkowski’s bound时),攻击者只要解出格$\, \mathcal{L}\,$上的SVP问题即可解出$\, v_r\,$,从而得到$\, v_r\,$第一个分量$\, dM\,$。$\,M\,$已知,因此攻击者可求出$\, d\,$,从而攻破这些共解密指数实例。
经过一些简单的不等式推导可得,当$\, d<N_r^{\delta_r}\,$且$\, \delta_r<\frac{1}{2}-\frac{1}{2(r+2)}-\log_{N_r}6\,$时,不等式$\,\left|v_{r}\right| < \sqrt{r+1} \det(\mathcal{L})^{1 /(r+1)}\,$ 一定能成立。因此$\, d<N_r^{\delta_r}\,$且$\, \delta_r<\frac{1}{2}-\frac{1}{2(r+2)}-\log_{N_r}6\,$就是在先前提出的假设成立时,攻击一定能成功的条件(具体推导请查阅参考资料,查找关键词common private)。
攻击的提出者Hinek在对RSA-2048/4096进行实验时发现要想保证攻击一定成功,实际的$\,\delta_r\,$要比满足前面这个不等式的$\,\delta_r\,$最大值小一点(大概小0.005左右)。
共用私钥的RSA实例个数$\,r\,$越大,攻击效果越好。Hinek进行了全面的攻击实验,当设定$\,r=35\,$,当$\, d<N^{0.485}\,$,数万次攻击基本全部成功。更详细的实验结果请查阅文末的参考资料。
以下代码在sagemath 9.1上运行。
当攻击成功时会计算并打印出正确的私钥$\,d\,$,当攻击失败时计算出的$\,d\,$是错误的。
1 | """ |
调用以下方法即可生成满足攻击条件的RSA实例。
1 | from Crypto.Util.number import getStrongPrime, getPrime, getRandomNBitInteger |
想理解格基约化算法,首先必须理解施密特正交化。有了向量空间,就可以在空间中随意对向量进行数乘和加减法(怎么做都不会跑出这个空间)。再定义向量的长度和夹角,施密特正交化就显得很自然了。
向量空间的定义保证了向量的数乘和加减法有很好的性质。具体定义略,可参阅蓝以中的《高等代数简明教程》等。
欧氏空间:设$\,V\,$是实数域$\,\mathbb{R}\,$上的向量空间。如果$\,V\,$内任意两个向量$\,\alpha,\ \beta\,$都按某一法则对应于$\mathbb{R}$内一个唯一确定的数,记作$\,\langle\alpha,\beta\rangle\,$,且满足以下三个条件:
则称$\,\left\langle\alpha,\beta\right\rangle\,$为向量$\,\alpha,\ \beta\,$的内积。$V\,$称为欧几里得空间,简称欧氏空间。
内积是一种具有非退化性的双线性映射,与密码学中常用的双线性对非常类似。
取$\mathbb{R}^{m} \,$的内积为向量的点乘,可以验证向量空间$\, \mathbb{R}^m\,$是欧氏空间。
对于$\mathbb{R}^m$中的向量$\,\alpha\,$,定义其欧氏范数为$\, \left| \alpha \right| = \sqrt{\left\langle\alpha,\alpha\right\rangle} \,$。实际上,欧氏范数就是平时所说的向量长度。
向量的欧氏范数计算方法是对其各分量的平方和开方,因此也称$\, 2 - \,$范数。格密码中还会用到$\, \infty \,-$范数。在本篇中,“范数”默认指欧氏范数。
正交补:设$\,V\,$是一个$\,n\,$维欧氏空间,$\,M\,$是它的一个子空间,易知$\,M\,$关于$\,V\,$的内积也成一欧氏空间。定义$\,M^\bot \!\subset \!\ V\,$为
称$\,M^\bot\,$为$\,M\,$的正交补。$\,M^\bot\,$关于$\,V\,$中向量的加法及数乘运算显然封闭,故$\,M^\bot\,$也为$\,V\,$的子空间。
为了从几何的角度理解正交补,不妨思考一下$\,\mathbb{R}^{2}\,$和$\,\mathbb{R}^{3}\,$中过原点的直线、平面的正交补分别是什么。
在欧氏空间$\,\mathbb{R}^m\,$中有施密特正交化方法。施密特正交化方法是由一个线性无关向量组得到一个正交向量组的方法,并且输入的向量组和输出的向量组张成的是同一个向量空间。格基约化算法的思路与施密特正交化相似并且算法中会调用施密特正交化,因此理解向量空间中的施密特正交化方法是理解格基约化算法的一个关键。
设$\mathbf{b}_1,\ldots,\mathbf{b}_n$为$\mathbb{R}^m$上一组线性无关的向量,施密特正交化方法如下:
令$\,\mathbf{b}_1^\ast=\mathbf{b}_1,$ 依次计算$\, \mathbf{b}_i^\ast=\mathbf{b}_i-\sum_{j=1}^{i-1}{\mu_{i,j}\mathbf{b}_j^\ast},\quad i>1\,$,其中$\,\mu_{i,j}=\frac{\left\langle\mathbf{b}_i,\mathbf{b}_j^\ast\right\rangle}{\left\langle\mathbf{b}_j^\ast,\mathbf{b}_j^\ast\right\rangle}\ ,\ 1\le j\,$。那么$\,\mathbf{b}_1^\ast,\cdots,\mathbf{b}_n^\ast\,$就是$\,\mathbb{R}^m\,$上的一组正交向量。
核心思路:先选$\,\mathbf{b}_1^\ast=\mathbf{b}_1$作为基准,然后将$\, \mathbf{b}_2 \,$分解为与$\, \mathbf{b}_1 \,$平行和正交的两个分量,只保留正交的那个分量。
更进一步的理解是,$\mathbf{b}_i^\ast\,$是$\, \mathbf{b}_i\,$在$\, \sum_{j=1}^{i-1}{\mathbb{R}\mathbf{b}}_j=\sum_{j=1}^{i-1}{\mathbb{R}\mathbf{b}_j^\ast}$ 的正交补上的投影。理解这一点才能搞懂格基约化算法的具体细节和优化。
这部分没有贴图,可以结合An Introduction to Mathematical Cryptography中格的图像方便理解
格:给定$n$个线性无关的向量$\mathbf{b}_1,\ldots,\mathbf{b}_n\in\mathbb{R}^m$,则称其整系数线性组合构成的集合
为$\mathbb{R}^m$上的格。我们称$\mathcal{L}$的秩为$n$,$\mathcal{L}$的维数为$m$。我们称上述格的定义中出现的$\mathbf{b}_1,\ldots,\mathbf{b}_n$为格$\mathcal{L}$的一组基,简称格基。
记$\ \mathbf{B}={(\mathbf{b}}_1,\ldots,\mathbf{b}_n)$,称$\mathbf{B}$为基矩阵,那么格$\mathcal{L}$可以进一步表示为
$\mathcal{L}=\sum_{i=1}^{n}\mathbf{b}_i\cdot\mathbb{Z}=\{\mathbf{B}x:x\in\mathbb{Z}^n\}$
可以验证$\, \mathcal{L}\,$为$\,\mathbb{R}^{m}\,$的离散加法子群。与向量空间$\mathbb{R}^m$类似地,格$\mathcal{L}$的基不止一个。事实上[3],任意一个秩为1的格有两组基,而秩大于等于2的格有无数组基。取格$\mathcal{L}$的任意两组基,一组基矩阵可由另一组基矩阵左乘一个幺模矩阵$\mathbf{U}$得到,$\mathbf{U}$是两个格基之间的过渡矩阵。
称格$\mathcal{L}$的一组格基围成的基本平行体为格$\mathcal{L}$的基本域,其严谨定义如下。
基本域:设$\mathcal{L}$为一个$n$维的格,且$\mathcal{L}$的一组基为$\mathbf{v}_1,\mathbf{v}_2,\ldots,\mathbf{v}_n$。则格$\mathcal{L}$(就格基$\mathbf{v}_1,\mathbf{v}_2,\ldots,\mathbf{v}_n$而言)的基本域$\mathcal{F}$为
之后定义格$\mathcal{L}$的行列式如下。
行列式:设$\mathcal{L}$为一个$n$维的格,其基本域为$\mathcal{F}$,则称$\mathcal{F}$的体积(volume)为格$\mathcal{L}$的行列式,记作$\mathrm{det}{(\mathcal{L})}=\mathrm{Vol}(\mathcal{F})$。设$\mathbf{B}={(\mathbf{b}}_1,\ldots,\mathbf{b}_n)为\mathcal{L}$的一组基,根据$\mathrm{det}{(\mathcal{L})}$的几何含义可知$\mathrm{det}(\mathcal{L})= \left | \mathrm{det}{(\mathbf{B})} \right |$。由此易知,虽然$\mathrm{det}{(\mathcal{L})}$被定义$\mathcal{F}$的体积,且$\mathcal{F}$与选取的格基有关,但$\mathrm{det}{(\mathcal{L})}$是格$\mathcal{L}$的一个不变量。即任意选取格$\mathcal{L}$的基本域(或者说选取格$\mathcal{L}$的任何一个格基),$\mathrm{det}{(\mathcal{L})}$的值都相同。这也是我们将其记为$\mathrm{det}{(\mathcal{L})}$的理由:其值只与格$\mathcal{L}$本身有关。
密码学中的运算对象基本都是整数,因此实际应用中往往使用整格(integral lattice),其定义如下:若格$\mathcal{L}$中任意向量的坐标,其每个分量均为整数,则称格$\mathcal{L}$为整数格。当$\mathcal{L}$为整格时,$\mathcal{L}$是$\mathbb{Z}^m$的加法子群。
整格有时候也称为整数格(integer lattice)。
格上的最短向量问题(SVP)是格密码方案安全性基于的难题,也是在格密码和传统公钥密码分析时常使用的问题。SVP及近似SVP问题正是格基约化算法求解的问题。
为了更好地描述格上短向量的长度,首先给出逐次最小长度的概念。
逐次最小长度:设$\mathcal{L}$是$\mathbb{R}^m$中秩为$n$的格,设$\lambda_1,\ldots,\lambda_n\in\mathbb{R}$,若$\lambda_{i}\left(1\le i\le n\right)$为满足以下条件的最小值:
存在$i$个线性无关的的向量$\mathbf{v}_1,\ldots,\mathbf{v}_i\in\mathcal{L}$,使得$v_j ≤λ_i (1≤j≤i)$
则称$\lambda_1,\ldots,\lambda_n$为$\mathcal{L}$的逐次最小长度。为了表明$\lambda_i$是格$\mathcal{L}$的逐次最小长度,记$\lambda_i=\lambda_i(\mathcal{L})$。
用通俗的语言来讲,$\lambda_1$是$\mathcal{L}$中非零最短向量的长度,$\lambda_2$是所有非零向量长度中(并列)第二小的长度。这就是逐次最小长度的意义。
为了让读者对$\lambda_1$的大小有一个认识,这里给出一系列相关定理来描述$\lambda_1$的上界。首先给出Minkowski定理作为引理。
Minkowski定理:设$\mathcal{L}$是$\mathbb{R}^m$中的格,$S \subset \mathbb{R}^m$是一个关于原点对称的可测凸集,若$S$的体积为$\mathrm{Vol}(S)\geq2^m\mathrm{det}(\mathcal{L})$,则$\, S\cap\mathcal{L}\,$中有非零向量。
解读:看起来有些高深,但是在$\mathcal{L} = \mathbb{Z}^{2}$中是显然的。要想让对称的凸集$S$尽量大,且$\ S\cap\mathcal{L}\ = \mathbf{0}$,那么正方形应该是最好的选择,此时$\mathrm{Vol}(S) = 2^2\mathrm{det}{(\mathcal{L})}$。类似地,在$\mathcal{L} = \mathbb{Z}^{m}$选取超立方体是最好的。照此思路,$\mathcal{L}$为整数格时Minkowski定理也是很显然的。这样就理解了密码学所用的格中该定理成立。
利用Minkowski定理可证明下面的Minkowski第一定理(一些文献称其为Hermite定理)。
Minkowski第一定理:设$\mathcal{L}$是$\mathbb{R}^m$中秩为$n$的格,则$\lambda_1(\mathcal{L}) \leq \sqrt n\mathrm{det}(\mathcal{L})^{1/n}$。称$\sqrt n\mathrm{det}(\mathcal{L})^{1/n}$为$\lambda_1\left(\mathcal{L}\right)$的Minkowski’s bound。
解读:如果$\mathcal{L} = \mathbb{Z}^{n}$,那么$\mathrm{det}(L)^{1/n}$就是超立方体$S$的边长,而$\sqrt n\mathrm{det}(\mathcal{L})^{1/n}$就是它的对角线长度。由于对角线的另一端就是一个格点,因此$\lambda_1\left(\mathcal{L}\right) \leq \sqrt n\mathrm{det}(\mathcal{L})^{1/n}$。
以上两个解读参考了Steven Yue的笔记,推荐看一下。
对于$\lambda_1\left(\mathcal{L}\right)$,我们还能得到比Minkowski’s bound更好的理论上界。下面给出Hermite因子的概念。
Hermite因子:给定格的维度$n$,定义Hermite因子$\gamma_n\in\mathbb{R}$为满足以下条件的最小值:
对于任意维度为$n$的格$\mathcal{L}$,存在$\, \mathbf{v}\in\mathcal{L}\,$满足$\ \left|\mathbf{v}\right|^{2} ≤γ_{n}\mathrm{det}{(\mathcal{L})}^{2/n}$。称$\sqrt{\gamma_n}\mathrm{det}\left(\mathcal{L}\right)^{1/n}$为$\ \lambda_1\left(\mathcal{L}\right) \,$的Hermite bound。
根据定义可知,Hermite因子的大小只与$n$有关,目前我们只知道$\gamma_n$在 $1\le n\le 8$ 和 $n=24$ 时的精确值:
在格密码学中我们更关心$n$较大$(n > 200)$时$\gamma_n$的值,此时$\gamma_n$满足
由Hermite因子能够得到比Minkowski’s bound更精确的$\lambda_1$上界。以维度为$n=2$的格$\mathcal{L}$为例,Minkowski’s bound告诉我们$\ \lambda_{1}(\mathcal{L})<\sqrt2\mathrm{det}(\mathcal{L})^{1/2}$ ,而由Hermite因子可得$\lambda_{1}(\mathcal{L}) < \sqrt{4/3} \mathrm{det}\left(\mathcal{L}\right)^{1/2}$。
下面的高斯启发函数与Hermite因子的下界很好地对应了起来。
高斯启发函数(Gaussian Heuristic):$GH(\mathcal{L})= \sqrt{\frac{n}{2\pi e}}\mathrm{det}(\mathcal{L})^{1/n}$
上述GH函数只能用于估计高维格的$\lambda_1\left(\mathcal{L}\right)$,在低维格中有另一个公式。然而低维格一般只在公钥密码分析中用的比较多,并且很多公钥密码分析中采用的是Minkowski’s bound作为假设。因此这里不给出(其实就是不想起敲公式了) ,具体可以看An Introduction to Mathematical Cryptography的相关小节。
我们往往不知道某个高维格的$\, \lambda_1\left(\mathcal{L}\right)\,$到底是多少,因此我们用$GH(\mathcal{L})$作为参考。在[SVP Challenge (latticechallenge.org)]中,若格基中最短向量的范数小于$1.05GH(\mathcal{L})$,就视为成功求解了SVP。
如果以上内容还有疑问,可以看看 An Introduction to Mathematical Cryptography 这本书的相关章节,也可以看看这个视频:数学潜水艇:初等数论、初等群论
Galbraith S D . Mathematics of Public Key Cryptography: Lattices. 2012.
阅读本篇前需要先了解格论,可以先看看格基规约算法:数学基础
在18到19世纪间,拉格朗日和高斯先后提出了一种二维格基规约算法,现今称为高斯算法。下面介绍原始的高斯算法。
以下内容基本来自 Lattice Basis Reduction: An Introduction to the LLL Algorithm and its Application .
首先先给出算法中出现的概念和符号。
最小基:设$\, \mathbf{x},\mathbf{y}\,$是二维格$\,\mathcal{L}\subset\mathbb{R}^2\,$的一组基。若$\, \mathbf{x},\mathbf{y}\,$满足$\,\left | \mathbf{x}\right | =\lambda_1\left(\mathcal{L}\right)\,$ 且$\, \mathbf{y}\,$是与$\, \mathbf{x}\,$线性无关的一个最短向量,则称$\, \mathbf{x},\mathbf{y}\,$是最小的(minimal)。最小基也被称为Minkowski约化基。
取整:记$\, \lceil\mu\rfloor\,$为距$\,\mu\,$最近的整数,即$\, \lceil\mu\rfloor=\left\lceil\mu-\frac{1}{2}\right\rceil\,$。我们规定对于整数$\,n\,$,$\lceil n+\frac{1}{2}\rfloor\,$的值为$\, n\,$ 。
下面给出高斯算法的伪代码描述。
高斯算法中蕴含的思想与欧几里得算法类似,两者都是不断地实施先约化后交换的策略。在伪代码中,(2)(b)是约化步,(2)(c)(ii)是交换步。在约化步中会计算施密特正交化的系数,并且为了确保在格$\,\mathcal{L}\,$上运算,不能直接用施密特正交化系数,而是要将其取整后得到的$\,m\,$作为约化步中减去$\,\mathbf{v}_2\,$的系数。当$\, \left|\mathbf{v}_1\right|\le\left|\mathbf{v}_2\right|\,$时,算法结束并输出此时的${\, \mathbf{v}}_1\,$和${\ \mathbf{v}}_2\,$。可以证明算法输出的${\ \mathbf{v}}_1$和${\ \mathbf{v}}_2\,$是一组最小基,下面简述证明思路。
证明思路:首先,由取整的定义易知在算法的步骤(2)(b)执行后,有$\,\left|\mathbf{v}_2^\prime\cdot\mathbf{v}_1\right|\le\frac{1}{2}\left|\mathbf{v}_1\right|^2\,$,其中$\, \mathbf{v}_2^\prime\,$是步骤执行后所得新基的第二个向量。或者说,每次(2)(b)执行完毕后有 $\mu_{2,1} \le \frac{1}{2}$(此时称${\, \mathbf{v}}_1,{\ \mathbf{v}}_2\,$是 size-reduced的)。结合算法终止时$\, \left|\mathbf{v}_1\right|\le\left|\mathbf{v}_2\right|\,$这一条件即可证明$\, \left|\mathbf{v}_1\right| = \lambda_{1}(\mathcal{L}) \,$。这一点从几何上非常直观,读者不妨考虑一下$\, \left|\mathbf{v}_1\right| = \left|\mathbf{v}_2\right|\,$时的情形。接下来再证$\,\mathbf{v}_2\,$是与$\,\mathbf{v}_1\,$线性无关的最短向量即可(证这一步有点繁琐)。
上述证明思路来源于二维空间上的几何直观,后面会看到在高维格中无法用类似的思路证明。在高维空间中,长度(2-范数)就没那么符合直觉了。由此也能侧面理解,为什么SVP问题在低维格中是容易的,在高维格中是困难的。
纵观高斯算法的流程,其实就是在不停地让两个向量互相约化,直到它们无法变得更短为止。因此,高斯算法可以视为一种贪心算法,且可以推广至高维(见后面的推广高斯算法)。
sagemath代码如下。
1 | def Gauss(x,y): |
高斯算法能够以平方级别的运行时间求解出一组Minkowski约化基(最小基),具体如下。
1982年诞生的LLL算法可视为高斯算法在高维格中的推广。接下来详细介绍原始LLL算法。
设$\ \mathcal{L}\subset\mathbb{R}^m\,$是$\,n\,$维格,算法输入$\, \mathcal{L} \,$的任意一组基,并以多项式时间输出一组LLL约化基。首先介绍LLL约化基的概念。
LLL约化基:设$\, \mathbf{b}_1,\ldots,\mathbf{b}_n \,$是$\, \mathcal{L}\,$的一组格基,若其满足以下两个性质:
则称$\, \mathbf{b}_1,\ldots,\mathbf{b}_n \,$是$\, \mathcal{L}\,$的一组$\delta-$LLL约化基。
性质2中的不等式$\,\delta\left| \mathbf{b}_i^\ast \right|^2\le\left|\mathbf{b}_{i+1}^\ast+\mu_{i+1,i}\mathbf{b}_i^\ast \right|^2\,$可以等价替换为$\, \left| \mathbf{b}_{i+1}^\ast \right|^2 \ge \left(\delta - \mu^{2}_{i+1,i} \right)\left| \mathbf{b}_{i}^\ast \right|^2 \ge \left(\delta - \frac{1}{4} \right)\left| \mathbf{b}_{i}^\ast \right|^2 \,$。性质1表明,LLL约化基中的向量是相对较短且近似正交的。性质2是为了根据范数对基中向量进行大致的排序。
下面给出LLL算法的伪代码:
sagemath代码如下,参考 https://kel.bz/post/lll/
1 | def max(a, b): |
在进行一次交换步或约化步之后,实际上只需要修改mu(施密特正交化系数)和Q(正交向量组)的个别值。而简易实现中,每次都会重新计算整个施密特正交化,这样的实现是低效的。
参考的伪代码不贴了,来源于 Lattice Basis Reduction - An Introduction to the LLL Algorithm and its Applications P.63
sagemath代码如下:
1 | def LLL_v1(M, delta=0.75): |
注:这两个版本的算法输出会有所不同,但这并不是因为代码写的有错误。两个算法求出的结果都是一组LLL-约化基。
在密码分析的使用中,一般会选取$\,\delta=0.99\,$或其他合适的值。我们最关心LLL求解SVP的能力,下面给出$\, \delta\,$取任意值时所得$\, \mathbf{b}_1\,$范数的上界。
约化能力:设$\, \mathbf{b}_1,\ldots,\mathbf{b}_n\,$是$\, n\,$维格$\, \mathcal{L}\,$的一组$\ \delta\,$- LLL约化基,则$\ \left| \mathbf{b}_1\right| \le\left(\frac{2}{\sqrt{4\delta-1}}\right)^{n-1}\lambda_1(\mathcal{L})\,$。
由定理可知,在LLL中$\, \delta\,$的选取会显著影响输出基的质量,$\, \delta\,$越大则基的范数越小。但算法中$\, \delta<1\ ,$,因此常见的选取为$\, \delta=0.99\,$。根据定理3.2.2,此时$\, \left|\mathbf{b}_1\right|<\left(1.35136\right)^\frac{n-1}{2}\lambda_1(\mathcal{L})\,$。
实际上,LLL算法输出基的质量在实践中一般优于上述定理给出的上界,以此估算LLL的实际表现是悲观的。与此相似,下面给出的时间复杂度上界也是一个悲观估计。
时间复杂度:设$\, \mathcal{L}\subset\mathbb{R}^m\,$为$\, n\,$维格,LLL算法输入基为$\, \mathbf{b}_1,\ldots,\mathbf{b}_n\,$,则LLL算法会在$\ O\left(n^6\ln^3\!{B}\right)\,$的时间内运行完毕。其中$\ \forall1\le i\le n\ ,\ \left|\mathbf{b}_i\right|<B\ .$
LLL算法的理论效能总结如下:算法能够在$\ O\left(n^6\ln^3{B}\right)\,$的时间内,输出质量较高的约化基。当算法中的参数选取为$\, \delta=0.99\,$时,输出基中第一个向量的欧氏范数满足$\, \left|\mathbf{b}_1\right|<\left(1.352\right)^\frac{n-1}{2}\lambda_1(\mathcal{L})\,$。再次强调,这些结论仅仅是算法性能的下限,直接用这些值来预测算法性能过于悲观。后面还会看到,改进LLL算法的时间复杂度明显优于这个上界。
1994年,Schnorr等人提出了BKZ算法。该算法比LLL算法的约化能力更强,可视为LLL算法的一种改进,其中使用了KZ约化(Korkin-Zolotarev reduction)和深插法(deep insertion)。下面介绍原始BKZ算法,而目前使用的BKZ 2.0在后面介绍。
KZ约化:KZ约化基是一组size-reduced,且其正交化后的向量范数为逐次最小长度的格基(特别地,基中第一个向量的长度即为$\,\lambda_1\,$)。计算高维格的KZ约化基是不切实际的,因为这需要要在输入格的投影子格上对SVP求解算法进行迭代式调用,其时间复杂度一般为超指数级。
为了以合理的时间代价得到比LLL约化基质量更好的基,Schnorr等人提出让格基的每个分块为KZ约化基即可。并且在原始BKZ中,分块的大小一般只会选取为10~30左右。下面给出BKZ约化基的概念。
BKZ约化:若$\, {\mathbf{b}}_1,\ldots,\mathbf{b}_n\,$为格$\,\mathcal{L}\,$的LLL约化基,且对于任意的$\,i\,$,有
,
则称${\ \mathbf{b}}_1,\ldots,\mathbf{b}_n\,$为格$\,\mathcal{L}\,$的一组$\,\beta-$BKZ约化基,称其中的$\, \beta\,$为BKZ的分块大小。
在BKZ算法中,只需在分块投影子格$\, \mathcal{L}([\pi_i(\mathbf{b}_i),\pi_i(\mathbf{b}_{i+1}),\ldots,\pi_i(\mathbf{b}_{min\left(i+\beta-1,n\right)})]) \,$上求解SVP,这要比KZ约化容易得多。BKZ中这个求解SVP的子算法称为SVP oracle,一般使用格枚举(lattice enumeration)实现。
原始的BKZ使用精确格枚举算法,这个算法一定能够在输入投影子格上求解出SVP,但它的时间开销很大。实用的BKZ使用的是剪枝枚举算法,这种算法只能以一定的概率求解SVP,但它的时间开销比前者小很多。
枚举算法可视为对枚举树的DFS,剪枝枚举则是剪枝DFS。
原始BKZ伪代码如下。
输入:格$\,\mathcal{L}\,$的基$\ B={(\mathbf{b}}_1,\ldots,\mathbf{b}_n)\,$,分块大小$\, \beta\in\left\{2,\ldots,n\right\}\,$,施密特系数矩阵$\, \mu\,$和${\, \left|\mathbf{b}_1^\ast\right|}^2,\ldots,\left|\mathbf{b}_n^\ast\right|^2 \,$
输出:$\,\beta-$BKZ约化基$\, {(\mathbf{b}}_1,\ldots,\mathbf{b}_n)\,$
算法步骤:
BKZ算法的大致流程如下:
先对输入基进行LLL作为预处理,之后对当前分块进行格枚举求解SVP。若枚举算法得到的最短向量不是当前分块的第一个向量,就将最短向量插入到分块前,重新对整个基进行LLL约化。直到对所有分块都操作完毕。这样得到的输出基通常会优于LLL约化基。分块大致可以视为一种滑动窗口,第一个分块是$(\mathbf{b}_1,\ldots,\mathbf{b}_{\beta})$,第二个分块是$(\mathbf{b}_2,\ldots,\mathbf{b}_{\beta + 1})$…总之每次窗口向右移动一个向量。注意最后的$\,\beta-2\,$个分块长度是小于$\,\beta \,$的。
为什么每次插入后要进行LLL呢?这主要是因为插入的子格最短向量与该子格的基线性相关,因此插入后当前的向量组就不是一组基了。而LLL能够消去线性相关性,同时进行一步约化。
Hanrot等人运用动力系统分析出BKZ的约化能力下界为$\, \left|\mathbf{b}_1\right|\le\beta^{\frac{n-1}{2\left(\beta-1\right)}+\frac{3}{2}} \det(B)^\frac{1}{n}\,$。另一方面,当$\, \beta\,$设置为输入格维度$\, n\,$时,由BKZ约化基的定义可知$\, \left|\mathbf{b}_1\right|=\left|\mathbf{b}_1^\ast\right|=\lambda_1\left(\mathcal{L}\right)\,$。此时若BKZ算法能够终止,则其能够成功地求解$\, \mathcal{L}\,$上的SVP问题。
尽管在实践中BKZ算法较为有效,但它至今仍没有被证明是多项式时间的算法。2008年,Gama和Nyugen在文指出当时BKZ时间复杂度的理论上界为$\,O\left(n\beta\right)^n\,$,关于维度$\, n\,$为超指数级(当然这也是悲观上界)。他们对BKZ进行了大量的实验。实验结果表明原始BKZ运行时间关于维度$\, n\,$似乎是指数级而不是多项式级。BKZ 2.0论文中指出,原始BKZ算法中$\,\beta=20\,$较为实用,但$\,\beta\geq25\,$时运行时间会显著增加。输入高维格时,选取分块大小为$\, \beta\geq40\,$会使BKZ运行得非常慢,甚至可能跑不出结果。
前面总结了原始格基规约算法,其中高斯算法在理论上被研究的很透彻,而LLL和BKZ的理论效能分析结论并不实用,只是算法的下限。
目前使用的改进LLL算法与改进BKZ算法已经比原始算法的效能好很多,因此在实战中不使用两种原始算法。但即便如此原始算法仍然是值得回顾的,很容易受到如下启发:
目前,sagemath中的格基规约算法默认采用fpLLL的实现。在fpLLL中默认的LLL算法依照 $\mathrm{L}^2$算法实现,并结合H-LLL;默认的BKZ算法主要依照BKZ 2.0实现。对于LLL和BKZ,下面仅简单总结了$\, \mathrm{L}^2\,$算法和BKZ 2.0算法。
该算法为一种浮点型LLL算法,其中采用了浮点数和大数运算算法来优化运行时间,并使用deep insertion来提升算法的约化能力。即便不使用大数运算优化,$\, \mathrm{L}^2$算法的理论时间复杂度也为$\, O\!\left(d^4(d+\log B)\,m \log B\right)\,$,远优于原始LLL。($\,d\,$是格的维度,$\,B\,$是输入基中最长向量的范数,$\,\mathcal{L} \subset \mathbb{R}^{m}$)
该算法为目前sagemath默认调用的BKZ算法,对原始BKZ算法进行了四个优化:
将极限剪枝枚举算法(extreme pruning)和一种高概率线性剪枝算法(linear pruning)这两种算法搭配起来,作为BKZ 2.0的SVP oracle(论文中称为sound pruning)。这比最早提出的Schnorr-Euchner剪枝枚举算法还要快很多 。
一次极限剪枝算法的成功概率虽低,但是速度非常快,以至于我们可以通过多次地调用它(例如一百次…),达到一个与其他算法相同的成功概率,速度却能快很多倍。
以大量实验结果为依据,使用Gaussian Heuristic启发式对剪枝枚举半径的值进行初始化。具体来说,枚举半径的初始值是1.05GH与输入格基的第一个向量范数中最小的那个。
BKZ 2.0的这些优化手段旨在降低BKZ的SVP oracle调用次数以及SVP oracle自身的运行时间。这一系列的优化使得BKZ 2.0可以使用较大的 $\, \beta\,$,从而使得其约化能力显著强于LLL。BKZ 2.0论文中指出,设定算法参数为$\,\beta \ge 90\,$,甚至$\,\beta = 110\,$都是可以的。
要想更深入的理解BKZ 2.0,就要学习一下格枚举算法。可以在某英文网站上看一下视频 Lattice-based cryptography II - Enumeration attacks 和 Random Sampling Revisited Lattice Enumeration with Discrete Pruning的前半部分。
BKZ 2.0论文是我的外文翻译,不过感觉这篇论文翻译难度较大,我的翻译还需完善一下。如果有人想看的话,可能会在2022年1月完善后放出。
2004年高斯算法被Nguyen等人推广至高维,他们指出推广算法在4维格中输出基为欧氏范数为Minkowski约化基(最小基)。同时,在4维格中算法复杂度(就输入基中最长向量范数的比特长度$\,n\,$而言)至少是平方级,若使用快速大数运算方法,算法的时间复杂度有希望提升到$\,O\!\left(n\log{n}\right)\,$级别。论文:Low-Dimensional Lattice Basis Reduction Revisited
下面提及的算法在fpLLL中也有实现。
H-LLL以$\,\mathrm{L}^2$算法为基础,在计算施密特正交化(QR分解)时使用householder算法替换了 Cholesky算法从而加快了运行速度。(具体做法并没这么简单,为了防止精度损失导致结果与原来不同,整个算法被重组)。论文:H-LLL: Using Householder Inside LLL
2008年,Gama和Nyugen提出了slide reduction。算法结构很漂亮,并且它的理论效能强于使用中止技术的BKZ。不过最初的slide reduction算法,其实际表现远不如BKZ 2.0算法。论文:Finding Short Lattice Vectors within Mordell’s Inequality
2016年, Micciancio和Walter获得了很大成果。他们提出一种在对偶格上枚举最短向量的方法,并且这种方法不需要计算对偶基。这使得他们能够在slide reduction使用很大的block size。改进后的slide reduction,其效能与BKZ 2.0几乎差不多。并且更重要的是,在block size的值适中时,其理论效能与实际效能几乎一致。这意味着无需进行实验就可以估计格基约化算法对格密码的冲击。此外,他们还提出一种SDBKZ(self dual BKZ,即自对偶BKZ),其实际效能与BKZ 2.0相差无几,但其理论效能很容易分析。总之,这篇论文对于想进一步了解格基规约算法的人来说非常值得阅读。论文:Practical, Predictable Lattice Basis Reduction
此外也推荐这些博客,与上面的内容相关:
Lattice Blog Reduction – Part I: BKZ | Calvin Café: The Simons Institute Blog
Lattice Blog Reduction – Part II: Slide Reduction | Calvin Café: The Simons Institute Blog
Lattice Blog Reduction – Part III: Self-Dual BKZ | Calvin Café: The Simons Institute Blog
目前最强的算法是基于G6K的BKZ(全称General Sieve Kernel,读作Jessica),可以在英文网站上查找相关的讲解视频。论文:The General Sieve Kernel and New Records in Lattice Reduction
为了保证阅读体验,我没有在正文标注引用。本人只是把这方面内容重新组织和总结了一下,又写了一点自己的理解。根据以下论文的名字不难找到本文内容的出处。
Hoffstein J , Pipher J C , Silverman J H . An Introduction to Mathematical Cryptography. 2008.
Galbraith S D . Mathematics of Public Key Cryptography: Lattices. 2012.
Nguyen P Q , D Stehlé. Low-Dimensional Lattice Basis Reduction Revisited. 2009.
Lenstra A . Factoring polynomial with rational coefficients. 1982.
Bremner M R . Lattice Basis Reduction: An Introduction to the LLL Algorithm and Its Applications. 2011.
Schnorr C P, Euchner M. Lattice basis reduction: improved practical algorithms and solving subset sum problems. 1994.
Gama, Nicolas, et al. “Lattice Enumeration Using Extreme Pruning.” EUROCRYPT’10 Proceedings of the 29th Annual International Conference on Theory and Applications of Cryptographic Techniques, 2010, pp. 257–278.
Chen Y, Nguyen P Q. BKZ 2.0: Better lattice security estimates. 2011.
PQ Nguyen, D Stehlé. Floating-Point LLL Revisited. 2005.
郑永辉,刘永杰,栾鸾.格基约化算法及其在密码分析中的应用综述. 2020.
Regev L O , Kaplan S E . Lattices in Computer Science LLL Algorithm. 2013.
Cohen H . A Course in Computational Algebraic Number Theory. 2013.
Hanrot G, Pujol X, Stehlé. Analyzing blockwise lattice algorithms using dynamical systems. 2011.
Gama N, Nguyen P Q. Predicting lattice reduction. 2008.
Morel I, Stehlé D, Villard G. H-LLL: using householder inside LLL. 2009.
Building Lattice Reduction (LLL) Intuition | kel.bz
Lattice Blog Reduction – Part I: BKZ | Calvin Café: The Simons Institute Blog
Lattice Blog Reduction – Part II: Slide Reduction | Calvin Café: The Simons Institute Blog
Lattice Blog Reduction – Part III: Self-Dual BKZ | Calvin Café: The Simons Institute Blog
Lattice Blog Reduction – Part III: Self-Dual BKZ | Calvin Café: The Simons Institute Blog
还有一些英文视频,因为一些你懂得的原因这里就不贴了。
]]>家里的网络结构是光猫接上路由器的WAN口,平时手机电脑上网时连路由器,路由器连光猫。就是那种很常见的小型家庭网络。
仔细看光猫,发现开启了路由模式(无线工作指示灯亮着),也就是说光猫既要进行光电信号的转换、拨号还要发射无线信号。但是光猫这玩意性能很差,这也是为什么我们要花钱买路由器。因此我们要把光猫的无线关掉。
网上说可以让光猫开启桥接模式,让路由器来拨号。但是联通的光猫设置起来好像比较麻烦,我也没找到设置选项。也有人说就让光猫拨号就行,一般情况下不用搞,而且改桥接还可能被运营商限速。所以这里就只关掉光猫的wifi功能,没调桥接,光猫的DHCP也没关。
这大概就是光猫的ip地址了,我们再用tracert看一下
第一跳肯定是我们的路由器,第二跳肯定是光猫,可见光猫确实是192.168.18.1这个IP地址了。
既然关DHCP费劲,调桥接模式更费劲,那光猫就没什么可优化的了。
就光猫这性能,防火墙铁定是鸡肋,不会有什么用的。家里的路由器开防火墙就足够了。我们把光猫的防DoS,ipv6spi统统关掉,节省一些光猫的性能。
有时候可能是家里看视频占带宽太大,网很卡。看到路由器CPU和内存负载挺低,那开个QoS吧。下载速度自己应该知道,上传速度,自己测一下就完事了。
想小优化一下,发现其实没太多可优化的。要想优化得细节一些又要花很多时间捣腾,先就这样吧。
]]>考试关键点:听到了选项要在纸上随时做标记,记录一些关键词
以练习精听为主,临考前可以再做几套听力题。
精听:拿一篇自己听起来有点困难的文章/对话,逐句听写。
一句话听数次,把自己听到的部分写在纸上,直到写下完整句子,或者连续听了两次都听不出来一个新词为止。之后纠正错误,补全没听懂的部分。如果这句话有没听懂的地方(尤其是连读),看着原句对照其发音再听,有能力可模仿其发音(连读)。
用来做精听的文章词汇量不要高于自己词汇量,至少有1000以上词汇量(初中水平)再做精听
如果有考试听力练习的原文,可以对听力材料做精听。
每周听3-4天,每天1次,至少15分钟并且至少80个词。
坚持一个月,四级听力150->190
坚持两个月150->210-220(词汇量不低于3000情况下)
每周天天听,坚持40天 150->210
基本上,听个7-10天就感觉有提升。
]]>