格密码基础:q-ary格

本文探讨了格密码在抗量子攻击、高效运算及密码学难题中的重要性,介绍了q-ary格和其子格的概念,以及与LWE和SIS问题的关系。NIST和国内的研究趋势显示,格密码在后量子密码算法中的关键角色以及跨学科融合的重要性。

目录

一. 格密码的重要性

二. 格密码基础

2.1 格点的另一种理解方式

三. q-ary格

3.1 q-ary垂直格

3.2 q-ary格

3.3 二者结合

四. 论文中的q-ary格

4.1 定理1

4.2 定理2

4.3 定理3


一. 格密码的重要性

格密码的基础是研究格点上的困难问题,这种格点使用抽象代数的观点则是R^n上的子群。格密码近些年非常火热,主要由于以下几点:

  1. 抗量子攻击。基于传统数论的公钥密码系统是无法抵抗量子攻击的,这也是格密码最大的优势;
  2. 效率很高,可以平行操作。这个其实不能一概而论,得看实际情况。但目前我们常见的格密码方案效率都挺高的;
  3. 可实现最坏情况与平均情况之前的归约(worst case to average case);
  4. 利用格密码相关理论可解决以前比较棘手的困难问题,这个地方的困难问题,指的是密码界常说的open question;

密码学的基础是LWE(learning with errors)和SIS(short integer solution)问题,当然也包括这两个问题的环版本。通常Ring版本的计算效率会更高。这两个问题可以实现可证明安全,由此让密码学家前仆后继。

二. 格密码基础

2.1 格点的另一种理解方式

有关格密码基础可以参看此篇博客:

格密码的基础概念-优快云博客

今天,可以从抽象代数的角度理解格点:m维的格\Lambda可以看成R^m上的离散加法子群

其中,格的秩与矩阵的秩k类似,满足k\leq m(在非满秩情况下,格的维度比最大的维度要小)。由此,给定格基B=\lbrace b_1,\cdots,b_k\rbrace,该格基由k个线性独立的m维列向量组成,对该格基进行遍历整数倍线性组合即可形成格,如下:

\Lambda=\lbrace Bz:z\in Z^k\rbrace

当然,正常情况下,研究格密码的论文大多是满秩格,也就是常说的\Lambda\subset Z^mk=m,也就是格基中向量的个数与向量的维度是一样的。(如果涉及格上高斯采样,有可能会出现非满秩格)。

2.2 对偶格

格形成的整个空间,通常叫做span(\Lambda)。如果从格上取一个格点x\in \Lambda,接着再取一个向量点v\in span(\Lambda),满足如下要求的点,称之为对偶格\Lambda^*

\langle v,x\rangle\in Z

这个是从格点的角度看对偶格,还可以从格基的角度出发。

如果格非满秩,原始格\Lambda的格基为B,那么对偶格的格基如下:

B^*=B(B^tB)^{-1}

大家看这个式子可能有点复杂,其实就是伪逆。在满秩格下,对偶格的格基就是先求逆再转置,如下:

B^*=B^{-t}

三. q-ary格

其实准确来讲,应该分为q-ary垂直格q-ary格,中文有的时候也叫q元格。

很多格密码的方案都是建立在q-ary格上的,之所以起这个名字是因为qZ^m一定是q-ary垂直格子格

备注:q-ary格一般都为整数格。

3.1 q-ary垂直格

我们先来看一个矩阵。对于正整数n和q,选出A\in Z_q^{n\times m}(密码学通常要求该矩阵随机取),这个矩阵是公开的,如果有一个向量z乘以该矩阵为0向量,那么把满足此条件的向量z全部都组合在一起,就称之为q-ary垂直格,如下:

\Lambda^\bot(A)=\lbrace z\in Z^m:Az=0 \quad mod\ q\rbrace

很明显可以得出qZ^m一定是该格的子格。

3.2 q-ary格

同样,先选出一个矩阵A\in Z_q^{n\times m},接着遍历向量s\in Z^n_q,将两者相乘,得到新的向量z,即可形成q-ary格,如下:

\Lambda(A^t)=\lbrace z\in Z^m:\exists s\in Z_q^n\ s.t.\ z=A^ts\quad mod \ q\rbrace

3.3 二者结合

实际上,q-ary格和q-ary垂直格互为q倍的对偶格,如下:

q\cdot \Lambda^\bot(A)^*=\Lambda(A^t)

在这里就不证明了。当然,部分论文类推,也会出现“1-ary”格,也就是:

\frac{1}{q}\Lambda(A^t)=\Lambda^\bot(A)^*

此格既包含整数,又包含小数,可得Z^m为其子格。

如果我们将Az=0中的0改为任意向量u\in Z_q^n,如下:

Ax=u\quad mod\ q

就会出现平移格或者叫陪集格(coset),如下:

\Lambda_u^\bot(A)=\lbrace z\in Z^m:Az=u \quad mod\ q\rbrace

陪集格与原始格的关系,如下:

\Lambda_u^\bot(A)=\Lambda^\bot(A)+x

四. 论文中的q-ary格

密码学三大会中经常会出现q-ary格,这里梳理一些论文中常用的相关结论。

随机取一个A\in Z_q^{n\times m},假定q-ary垂直格\Lambda^\bot(A)的某个格基为S\in Z^{m\times m}

注意矩阵A的维度与格维度的关系。

4.1 定理1

对任意幺模矩阵T\in Z^{m\times m},都有:

T\cdot \Lambda^\bot(A)=\Lambda^\bot(A\cdot T^{-1})

理解:该定理描述了幺模矩阵与q-ary垂直格的关系。左边T\cdot \Lambda^\bot(A)代表对每个q-ary垂直格进行幺模矩阵变换,该新格的格基为T\cdot S。右边代表对矩阵A的变换,看q-ary格的原始定理可直接列出。

4.2 定理2

对任意可逆的方阵H\in Z_q^{n\times n},q-ary垂直格都满足:

\Lambda^\bot(H\cdot A)=\Lambda^\bot(A)

理解:矩阵可逆的话,HAz=0可直接变为Az=0,与原来的q-ary垂直格等效。(注意矩阵H的顺序在左边)

4.3 定理3

设定矩阵A\in Z_q^{n\times m}的列秩大于等于n,也就是矩阵A中有m个列向量,每个向量的维度为n,换句话说也就是矩阵A的列向量可构成整个空间Z_q^n。接着随机取矩阵A'\in Z_q^{n\times m'}以及矩阵W\in Z^{m\times m'},满足如下:

AW=-A'\quad mod\ q

接着我们可以借助此性质对q-ary垂直格的矩阵A进行扩展,形成新的q-ary垂直格\Lambda^\bot ([A'|A]),该q-ary垂直格的格基为:

S'=\left[ \begin{array}{cc}I&0\\W&S \end{array} \right]

证明:

简单来看,将[A'|A]看成一行两列的矩阵,将S'看成两行两列的矩阵,运算:

[A'|A]\cdot S'=[A'|A]\cdot\left[ \begin{array}{cc}I&0\\W&S \end{array} \right]

运算的结果为一行两列。

第一个元素运算可得:

A'I+AW

其中AW满足:

AW=-A'\quad mod\ q

带入可得:

A'I+AW=A'+(-A')=0

第二个元素运算可得:

A'\cdot 0+AS=AS

综上可得:

[A'|A]\cdot S'=AS

也就是新的q-ary垂直格\Lambda^\bot ([A'|A])的格基为S'

另外,我们知道格基是可以进行正交化的。其实S'正交化后的矩阵如下:

\tilde S'=\left[ \begin{array}{cc}I&0\\0&\tilde S \end{array} \right]

单位矩阵不改变长度,通过矩阵的表达形式不难看出,该矩阵的模长与原始格基S正交化的模长相等,也就是:

||\tilde S'||=||\tilde S||

小结补充

NIST 的 CRYSTALS-KYBER、FALCON、CRYSTALS-Dilithium 和 Sphincs+ 4 个 PQC 标准化算法中,除了 Sphincs+ 为基于哈希函数的签名算法,其他均为基于格的密码算法。国内也投入了大量研究力量集中攻关基于格的密码算法。后量子密码算法除了基于格、哈希函数、多变量、编码的技术路线,还有基于同源曲线的技术路线。因此,有必要拓展更多的后量子密码算法体制研究方向来积极应对未知的量子计算世界。回归本源,密码学是数学的延伸,探索密码学和数学的跨学科融合,利用现代数学的理论赋能密码学的拓展研究,探索新的数学困难问题,有利于研制具有自主技术特色的后量子密码体制。
 

### 关于 `ary=:all:` 的用法或含义 在编程领域中,`ary=:all:` 并不是一个标准的语法结构,因此其具体意义可能依赖于特定的语言环境或者框架定义。然而,在某些高级脚本语言(如 Ruby 或 Python)以及数据处理库(如 NumPy 或 Pandas),类似的表达方式可以被解释为一种特殊的切片操作。 #### 可能的意义之一:数组全选 如果假设 `ary` 是一个变量名,表示某种集合型的数据结构(例如列表、数组或多维矩阵),那么冒号 (`:`) 和关键字 `:all:` 组合在一起可能是为了指示选取整个范围的内容。这种模式常见于科学计算工具包中的索引机制[^2]。例如: - **NumPy 中的全量选择** 在 Python 的 NumPy 库中,`:` 单独作为索引时表示“全部”。虽然没有直接写成 `:all:` 的形式,但功能上类似: ```python import numpy as np array = np.array([[1, 2], [3, 4]]) result = array[:, :] # 表示取所有行和列 ``` - 如果某自定义实现扩展了这一概念,则可能会引入更直观的关键字标记来增强可读性,比如允许书写为 `array[:all:, :all:]` 来代替传统的双冒号。 #### 可能的意义之二:配置参数 另一种可能性存在于函数调用场景下。当开发者希望传递给某个方法一个特殊标志表明需要应用到对象的所有成员时,“`= :all:`” 这样的赋值语句便显得合理而简洁。这尤其适用于那些支持符号常量 (Symbol Constants) 的动态类型语言里[^3]。举个例子来看: ```ruby def process_elements(ary, filter_rule = :none) case filter_rule when :all then puts "Processing all elements" when :some then puts "Only processing selected ones" else raise ArgumentError.new("Unknown rule #{filter_rule}") end end process_elements([1,2,3], :all) # 输出 Processing all elements ``` 上述代码片段展示了如何利用 Ruby 符号(`Symbols`)指定默认行为为作用域内的每一个项目都执行相应逻辑。 综上所述,尽管目前尚无确切证据证明存在名为 `ary=:all:` 的通用约定俗成做法,但从现有技术实践推测它很可能要么代表对某一维度上的完全提取,要么充当开关式的选项声明手段用于控制流程走向。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唠嗑!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值