格基础
格的介绍#
参考:链接
数学上的定义#
1、定义在非空有限集合上的偏序集合 L,满足集合 L 中的任意元素 a,b,使得 a,b 在 L 中存在一个最大下界,和最小上界。
2、群论中的定义,是 RnRn 中的满足某种性质的子集。当然,也可以是其它群。
格的研究方向 #
1、格中计算问题的困难性,即这些问题的计算复杂性,主要有:
- SVP 问题 (最短向量问题)
- CVP 问题(最近向量问题)
2、如何求解格中的困难性问题,目前既有近似算法,也有一些精确性算法。
3、基于格的密码分析,即如何利用格理论分析一些已有的密码学算法,目前有如下研究:
- Knapsack cryptosystems(背包密码)
- DSA nonce biases(DSA随机数偏差)
- Factoring RSA keys with bits known(用已知位分解RSA秘钥)
- Small RSA private exponents(小型RSA私有指数)
- Stereotyped messages with small RSA exponents(具有较小RSA指数的定型消息)
4、如何基于格困难问题设计新的密码体制,这也是后量子密码时代的重要研究方向之一,目前有以下研究:
- Fully homomorphic encryption(全同态加密)
- The Goldreich–Goldwasser–Halevi (GGH) cryptosystem(GGH密码)
- The NTRU cryptosystem(NTRU密码)
- The Ajtai–Dwork cryptosystem and the LWE cryptosystem(AD和LWE密码)
格的发展#
参考:链接
时间 | 标志事件 |
---|---|
18世纪–1982年 | 格经典数学问题的讨论,代表人物:Lagrange,Gues,Hermite,MInkowski等 |
1982年–1996年 | 期间标志性事件是LLL算法的提出(Lenstra-Lenstra-Lovasz) |
1996年–2005年 | 第一代格密码诞生(Ajtai96, AD97G, GH9) |
2005年–2016年 | 第二代格密码出现并逐步完善,并实用化格密码算法 (Regev05, GPV08,MP12 BLISS ,NewHope, Frodo) |
2016年– | 格密码逐步得以标准化 |
发展:
从前 | 现在 |
---|---|
具有悠久历史的格经典数学问题的研究 | 近30多年来高维格困难问题的求解算法及其计算复杂性理论研究 |
使用格困难问题的求解算法分析非格公钥密码体制的安全性 | 基于格困难问题的密码体制的设计 |
优势:
格密码 | 经典密码 |
---|---|
量子攻击算法 | Shor算法 |
矩阵乘法、多项式乘法 | Shor算法 |
Worst-case hardness | Average-case hardnes |
结构灵活、功能丰富 | 结构简单、功能受限 |
格的定义#
直观的讲,格是在空间中满足平移不变性的“规则排列”的离散点集合,如下是二维格与它可能的两组基:
具体定义如下:
基础知识#
1、det(A)
指方阵A的行列式
2、向量范数
3、基础区域 F
一个格L的任何基础区域都有着相同的 “体积”
下面的平行四边形即为一个【基础区域F】
基础区域 F 的n维体积称为 L 的行列式,记为det L
4、Hadamard 不等式
det L = vol(F)≤ || v1|| || v2|| .....|| vm|| ,基向量越接近垂直,等式越成立
vol(F)是F的体积
5、dim(L)
格的维度,即格的基中的向量个数
6、Hadamard比率
用于描述一组向量的正交程度
格的基 B ={v1,v2,...,vn},有
0< H(B)≤1,且越接近1,则基中的向量就越接近两两正交
matlab代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function [result] = H(m) % 计算一组基的Hadamard比率 % 输入:基向量作为行向量所构成的方阵 % 输出:当前基的Hadamard比率 % 1、取出矩阵中的每个行向量 % 2、按照Hadamard比率公式计算 % 3、返回计算结果 n = size (m); %m是矩阵,size返回矩阵维度(行,列) n = n(1); %取行 product = 1; for i = 1:n product = product * norm (m( i ,:)); % norm求每个行向量的向量范数,product是 ||v1|| ||v2|| ... ||vn|| end result = ( abs ( det (m)) / product)^(1/n); %abs取绝对值,det是矩阵的行列式 end |
7、格基相互转化
格L的任意两个基可以通过在左边乘上一个特定的矩阵来相互转化,这个矩阵由整数构成,且它的行列式为 ±1
8、生成优质基
随机生成满足Hadamard比率的优质基
matlab代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 | function result = good_basis(N,v,h) % 随机生成一组优质基 % N是基向量的坐标的绝对值上限,v是向量的个数(格的维度),h是Hadamard比率的下限 % 输入:向量中坐标的取值下限,基中向量的个数,Hadamard比率的下限 % 输出:矩阵形式的优质基 % 1、根据取值下限和维度,随机生成矩阵 % 2、调用H()计算Hadamard比率 % 3、若比率大于下限,则返回该矩阵,否则跳转1 result = unidrnd(2*N,v) - N; %unidrnd 返回随机方阵 while H(result) < h result = unidrnd(2*N,v) - N; end end |
9、计算矩阵行范数
matlab代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 | function [result] = row_norm(m) %计算一个矩阵的行范式 % 输入:矩阵形式的一组基 % 输出:一个包含每一个行向量范数的列向量 % 1、取出矩阵中的每个行向量 % 2、计算每个行向量的范数 % 3、返回计算结果 n = size (m); result = zeros (n(1),1); % 返回一个全0的矩阵(n(1)行,1列) for i = 1:n(1) result( i ,1) = norm (m( i ,:)); % 每个列向量的第一个位向量范数 end end |
10、向量正交化
施密特正交化:
matlab代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function [M] = orthogonal(m) % 使用施密特正交化对矩阵m以行为单位进行正交化,并未单位化 % 输入:矩阵形式的一组基 % 输出:正交化后的矩阵 n = size (m); M = zeros (n); n = n(1); M(1,:) = m(1,:); for i = 2:n M( i ,:) = m( i ,:); for j = 1: i -1 u_ij = dot (m( i ,:),M( j ,:)) / ( norm (M( j ,:))^2); M( i ,:) = M( i ,:) - u_ij * M( j ,:); end end end |
格中困难问题#
最基本的难题SVP和CVP,其他的困难问题可由这两种问题变形得到。
SVP#
Shortest Vector Problem,最短向量问题
在格中寻找一个最短的非零向量,即寻找一个向量 v∈ L,使得它的欧几里得范数 ||v|| 最小
问题:一个格的最短非零向量多长?
高斯期望(高斯启发式)可以求出最短向量问题
CVP #
Closest Vector Problem,最近向量问题
给定一个不在格L中的向量 t∈Rm ,寻找一个向量 v∈ L,使得它最接近w,即寻找一个向量 v∈ L,使得它的欧几里得范数 ||w - v|| 最小。
问题:如何使向量接近两两正交的基来求解最近向量问题?
方法1:寻找顶点法
“优基”适合,“劣基”不合适
方法2:
Babai算法
SIVP#
GaqSVP#
LWE#
2005年,Regev在文献中首次提出了标准错误学习问题(SLWE),该问题已经成为格密码学中广泛使用的密码学基础。SLWE问题是一个平均情况下的问题,Regev将SLWE问题量子归约到格上标准困难问题。因此在SLWE问题之上建立的所有密码学方案,均能够将其安全性建立在格困难问题的最坏情况之上。接下来我们给出LWE分布,与LWE问题的两个版本:搜索LWE问题与判定LWE问题。
SLWE困难性:#
可以规约到格上。
LWE分布:#
搜索LWE:#
判定LWE:#
RLWE#
困难性:#
SIS#
Small Integer Solution Problem ,最小整数解问题
定义:
给定整数q,矩阵
LLL算法#
功能:将一个劣质基转换成一个优质基,且优质基中的第一个行向量就是格中的最短非零向量
算法为两部分:
基格约减#
劣质基会变得更优,且基中向量的范数也会适当的减小
matlab代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 | function [result] = LLL(v) % 格基约减的控制算法,对矩阵处理,v是每行的行向量 % 输入:矩阵形式的一组基 % 输出: 约减一次后的基 a = LLL_if(v); b= LLL_if(a); while a ~= b % a和b不同时 a = b; b = LLL_if(b); end result = b; end |
控制算法#
控制基格约减的循环条件
matlab代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | function [result] = LLL_if(v) % LLL约减算法 % 输入:矩阵形式的一组基 % 输出:约减后的基 % 1、对输入参数,调用LLL() % 2、对1的结果再次调用LLL() % 3、重复2,直到结果不再变化 % 4、返回不再变化的结果 n = size (v); n = n(1); k = 2; while k <= n V = orthogonal(v(1:k,:)); for j = 1:k-1 u = dot (v(k,:),V( j ,:)) / ( norm (V( j ,:))^2); v(k,:) = v(k,:) - round (u) * v( j ,:); end u = dot (v(k,:),V(k-1,:)) / ( norm (V(k-1,:))^2); if norm (V(k,:))^2 >= (3/4 - u^2) * norm (V(k-1,:))^2 k = k + 1; else temp = v(k-1,:); v(k-1,:) =v(k,:); v(k,:) = temp; k = max (k-1,2); end end result = v; return ; end |
GGH#
原理#
Alice
1、秘钥生成
(1)选择一个优质基 v1,v2,...,vn ,作为私钥
(2)选择一个整数矩阵U,使det(U) = ±1
(3)计算W = UV,并以W的行向量w1,w2,...,wn作为公钥发送给Bob
Bob
2、加密
(1)以小向量m作为明文
(2)随机选择小向量r
(3)使用Alice的公钥计算e = m1w1+.....+mnwn+r
(4)将e作为密文发送给Alice
Alice
3、解密
(1)使用Babai算法计算出最接近e的格向量v = round(eV-1).V
(2)计算vW-1得到明文m
PS:另外一个版本
交换m和r的位置,即密文e =rW+m ,明文m = e - rW
分析#
1、生成私钥
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >> V = good_basis(1000,5,0.9) V = 499 833 -229 -589 -233 291 -792 382 -142 361 -176 305 906 991 -579 63 840 58 806 665 980 -572 -534 209 -117 >> H(V) ans = 0.9017 |
V为优质基 ,私钥
2、生成公钥
如何生成一个行列式为 ±1 的矩阵U,通过几个简单地行列式为 ±1 的随机整数矩阵相乘得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >> U = [1,2,3,5,8;0,-1,4,6,9;0,0,1,7,10;0,0,0,-1,11;0,0,0,0,-1]*[-1,0,0,0,0;12,1,0,0,0;13,16,1,0,0;14,17,19,1,0;15,18,20,21,1] U = 252 279 258 173 8 259 327 298 195 9 261 315 334 217 10 151 181 201 230 11 -15 -18 -20 -21 -1 >> det (U) ans = 1.0000 |
求 W = U * V:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >> W = U*V W = 180268 208382 288380 208742 6730 193055 206305 342095 255384 13780 186591 246363 370411 309527 2651 117914 230644 224135 272229 65442 -11506 -21407 -22245 -25564 -5271 >> H(W) ans = 0.0038 |
W为劣质基,公钥
3、加密明文
m为明文,r为随机数向量
计算密文e:
1 2 3 4 5 | >> e = [33,26,-112,47,-91]*W +[-3,-7,2,-2,5] e = -3340917 -2563822 -10516380 -6017469 3838898 |
4、LLL破解
攻击者已知密文和公钥的前提下,利用LLL算法破解
W是劣质基,使用LLL算法,将其转换为优质基V1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >> V1 = LLL(W) V1 = 291 -792 382 -142 361 -790 -41 -153 731 -128 -614 -346 -1059 -260 451 -936 1536 -1204 -380 -1748 -14817 44613 -22155 7572 -20566 >> H(V1) ans = 0.3771 |
额,打脸了,检查了三遍,LLL函数也没写错,待后续发现~
用LLL算法生成的 “优质基”V1解密:
1 2 3 4 5 6 7 8 9 10 11 | >> v = round (e / V1)*V1 v = -3340914 -2563815 -10516382 -6017467 3838893 >> m = v / W m = 33.0000 26.0000 -112.0000 47.0000 -91.0000 |
解密成功??,这是什么操作,劣质基也能?
待后续发现~
同余公钥密码系统#
同余密码系统#
1、秘钥生成
(1)Alice选择一个大整数q,并选择秘密整数 f 和 g ,满足 f < =
(2)Alice计算h = f-1g(mod q),并将(q,h)作为公钥进行发布,私钥(f,g)
2、加密
Bob选择明文m,满足m <
3、解密
Alice计算a = fe(mod q),其中 0< a < q。然后计算 b = f-1a(mod g),0 < b < g,b即为明文
基于格的同余密码#
攻击者在已知公钥和密文的前提下,用格进行分析:
目的:还原出私钥f
构造向量 v1 = (1,h),v2 = (0,q)
利用v1和v2构造一个格L,故私钥构成的向量(f,g)也是L中的向量,故存在整数R使得 (f,g) = f . (1,h)+ R . (0,q)= f . v1 + R . v2
(f,g)很有可能就是格L的最短向量,故找到L的最短向量就找到了私钥
背包密码#
背包问题#
子集求和问题
给定正整数集合A = {a1,a2,....,an}和n元的0-1集合X = {x1,x2,.......,xn},A是确定的,集合X将确定集合A中的哪些元素可以放到背包中,背包中元素总数为
当A和X已知时,求S容易,若已知S和A时,求X是困难的,这就是背包问题
向量问题
A = (a1,a2,....,an)是公开的整数向量,Bob选择一个秘密的二进制向量X = (x1,x2,.......,xn),其中xi取值为0或者1,Bob计算总和
背包问题要求Alice要么找到原始二进制向量X,要么找到另一个二进制向量,使其总和同样为S
Alice可以从向量X中得知哪个ai包含在S中,因为ai是包含于总和S中的,因此,确定二进制向量X等同于确定A的子集
Alice可以通过检查所有的(2n个)长度为n的二进制向量来找X,若n很大时,这是非常困难的,若Alice有一些与A相关的秘密知识或陷门信息,使得得到的X是惟一的,这样可以容易的求出X,从而破解背包问题,即Alice已知S,可以恢复出明文X。
超递增序列背包#
在MH背包密码系统中,会利用一种超递增序列的背包问题来构造陷门信息
超递增序列
整数序列A={a1,a2,....,an},当且仅当对任意1 ≤ i ≤ n-1 ,均有ai+1≥2ai,则称这样的序列为超递增序列
若A是超递增序列,则对于所有的2≤k≤n,有ak > ak-1 + ... + a1
求解算法
穷举法 ,时间O(n)
超递增序列背包求解算法 | |
输入:超递增序列A={a1,a2,....,an}以及正整数S 输出:X = (x1,x2,.......,xn) 1、令 i =n 2、若S ≥ ai,则令xi =1,同时令S =S - ai,否则令xi = 0 3、令i =i - 1,若i = 0,则算法结束,否则跳转2 |
MH背包公钥密码#
Merkle 和 Hellman 提出的
主要思想:以一个秘密的超递增序列作为初始条件,然后利用秘密的模线性运算来进行伪造,最后将伪装后的序列作为公钥进行发布
缺点:若n小于300,不安全,若大于300,私钥长度过大
1、秘钥生成
Alice
超增序列 R = {r1,r2,...,rn}来创建公钥M和私钥对(R,A,B):
(1)秘密选择两个大整数A和B,满足B > 2rn 和 gcd (A,B) = 1
(2)生成新序列M = {M1,M2,....,Mn},Mi = Ari (mod B),0 ≤ Mi < B
2、加密
Bob
选择明文X = (x1,x2,.......,xn),其中xi是0或1,计算密文S = x.M =
3、解密
(1)计算S‘ = A-1S(mod B) ,0 ≤ S’ < B ,这时序列R和S’构成了一个超递增序列求和问题,
(2)Alice可以利用“超递增序列背包求解算法”求出明文X
基于格的背包密码#
使用LLL算法对背包问题分析:
(1)构造一个格L,其基写成矩阵形式:
(2)设背包难题的解X = (x1,x2,.......,xn),其中xi是0或1,则格L中一定包含向量:t = (x1,x2,...,xn,-1).B = x1v1+x2v2+...+xnvn - vn+1 = (2x1 - 1,2x2 - 1,....,2xn-1 - 1,0),xi是0或1,即t的长度为
NTRU#
参考:链接
作者:Hang Shao
出处:https://www.cnblogs.com/pam-sh/p/14265017.html
版权:本作品采用「知识共享」许可协议进行许可。
声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2020-02-18 Flex:实例
2020-02-18 项目一:显示头像和昵称
2020-02-18 小程序 准备工作