面向后量子密码的 SageMath 基础
《应用后量子密码学》本章的全部代码:共 27 段,其中 27 段可在此运行。编辑任意单元格,然后点击运行。
书中的代码片段在一章之内层层相依,但 Sage Cell 内核每次只运行一个单元格,运行后不保留任何状态,因此每个单元格都会用 apqc_book 重放此前的代码。这一调用是在书中原有代码之外唯一添加的内容。
代码 1:SageMath 与 Python
SageMath 构建在 Python 之上,但增加了更丰富的数学类型和对象。普通的 Python 整数与 Sage 整数并不是同一种东西。
代码 2:SageMath 与 Python
在 Python 中,结果是一个普通整数。而在 Sage 中,对应的对象可能带有代数含义。
代码 3:SageMath 与 Python
要查看类型,可以使用:
代码 4:整数 ℤ
整数环以 ZZ 的形式提供。
代码 5:整数 ℤ
你可以显式地创建整数:
代码 6:整数 ℤ
基本算术运算的行为符合预期:
代码 7:整数 ℤ
除法的处理比 Python 中更加审慎,因为 Sage 会尽可能保持符号运算和精确运算:
代码 8:整数 ℤ
结果是有理数 10/3。整数除法可以通过下式进行:
代码 9:整数 ℤ
模运算则通过下式进行:
代码 10:有理数 ℚ
有理数域是 QQ。
代码 11:实数 ℝ 与复数 ℂ
SageMath 同样支持实数域和复数域。
代码 12:实数 ℝ 与复数 ℂ
例如:
代码 13:创建有限域
例如,含有七个元素的域为:
代码 14:创建有限域
通过将值强制转换到域中来创建元素:
代码 15:创建有限域
算术运算是模该素数进行的:
代码 16:逆元
在密码学中,逆元无处不在。对于域元素 a,其逆元 a^-1 满足 a a^-1 = 1。
代码 17:有限域上的线性代数
有限域上的线性代数是许多基于格的构造的出发点。
代码 18:有限域上的线性代数
逆矩阵可以这样计算:
代码 19:有限域上的线性代数
并且可以验证得到单位矩阵:
代码 20:向量与矩阵
向量便于表示秘密值和噪声项。
代码 21:向量与矩阵
于是矩阵与向量的乘法就很直接了:
代码 22:构建多项式环
代码 23:构建多项式环
现在 x 是该环中的一个形式变量。
代码 24:构建多项式环
加法和乘法按通常的代数方式进行:
代码 25:商环
商环是通过施加一个多项式关系来构造的。例如:
代码 26:第一个密码学实验
作为第一个实验,我们可以验证模逆元的行为。
代码 27:第一个 LWE 风格的示例
为了给后面的章节做铺垫,我们可以在有限域上构造一个简单的线性方程组: