Applied PQC 首页 本书 在线演练 博客 @AppliedPQC English

面向后量子密码的 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 风格的示例

为了给后面的章节做铺垫,我们可以在有限域上构造一个简单的线性方程组: