格基礎


格的介紹

參考:鏈接

數學上的定義

1、定義在非空有限集合上的偏序集合 L,滿足集合 L 中的任意元素 a,b,使得 a,b 在 L 中存在一個最大下界,和最小上界。

2、群論中的定義,是 RnRn 中的滿足某種性質的子集。當然,也可以是其它群。

格的研究方向 

1、格中計算問題的困難性,即這些問題的計算復雜性,主要有:

  1. SVP 問題 (最短向量問題)
  2. CVP 問題(最近向量問題)

2、如何求解格中的困難性問題,目前既有近似算法,也有一些精確性算法。

3、基於格的密碼分析,即如何利用格理論分析一些已有的密碼學算法,目前有如下研究:

  1. Knapsack cryptosystems(背包密碼)
  2. DSA nonce biases(DSA隨機數偏差)
  3. Factoring RSA keys with bits known(用已知位分解RSA秘鑰)
  4. Small RSA private exponents(小型RSA私有指數)
  5. Stereotyped messages with small RSA exponents(具有較小RSA指數的定型消息)

4、如何基於格困難問題設計新的密碼體制,這也是后量子密碼時代的重要研究方向之一,目前有以下研究:

  1. Fully homomorphic encryption(全同態加密)
  2. The Goldreich–Goldwasser–Halevi (GGH) cryptosystem(GGH密碼)
  3. The NTRU cryptosystem(NTRU密碼)
  4. 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 不等式

L是一個格,任意一個基和基礎區域 F ,有

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代碼實現:

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代碼實現:

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代碼實現:

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代碼實現:

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中的向量 tRm ,尋找一個向量 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,矩陣$ A \in Z_q^{n \times m} $和實數B,尋找一個非零向量x∈Z,使得Ax = 0(mod q),且||x|| ≤ B

LLL算法

功能:將一個劣質基轉換成一個優質基,且優質基中的第一個行向量就是格中的最短非零向量

算法為兩部分:

基格約減

劣質基會變得更優,且基中向量的范數也會適當的減小

matlab代碼實現:

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代碼實現:

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、生成私鑰

>> 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 的隨機整數矩陣相乘得到

>> 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:

>> 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:

>> e = [33,26,-112,47,-91]*W +[-3,-7,2,-2,5]

e =

    -3340917    -2563822   -10516380    -6017469     3838898

4、LLL破解

攻擊者已知密文和公鑰的前提下,利用LLL算法破解

W是劣質基,使用LLL算法,將其轉換為優質基V1:

>> 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解密:

>> 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 < =$ \sqrt{q/2} ,\sqrt{q/4}< g< \sqrt{q/2}$,gcd(f,g)=1。

(2)Alice計算h = f-1g(mod q),並將(q,h)作為公鑰進行發布,私鑰(f,g)

2、加密

Bob選擇明文m,滿足m < $ \sqrt{q/2}$,r 是隨機數,Bob使用Alice的公鑰(q,h)計算e = rh + m (mod q),並發送密文e給Alice

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中的哪些元素可以放到背包中,背包中元素總數為 $ \sum\limits_{{\rm{i = 1}}}^n {{x_i}{a_i}} $

當A和X已知時,求S容易,若已知S和A時,求X是困難的,這就是背包問題

向量問題

A = (a1,a2,....,an)是公開的整數向量,Bob選擇一個秘密的二進制向量X = (x1,x2,.......,xn),其中xi取值為0或者1,Bob計算總和 $ \sum\limits_{{\rm{i = 1}}}^n {{x_i}{a_i}} $,並將發送給Alice。

背包問題要求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 = $ \sum\limits_{{\rm{i = 1}}}^n {{x_i}{M_i}} $ ,將其發送給Alice

3、解密 

(1)計算S‘ = A-1S(mod B) ,0 ≤ S’ < B  ,這時序列R和S’構成了一個超遞增序列求和問題,$ S' = {A^{ - 1}}S = {A^{ - 1}}\sum\limits_{i = 1}^n {{x_i}A{r_i}}  = \sum\limits_{i = 1}^n {{x_i}{r_i}} (\bmod B)$

(2)Alice可以利用“超遞增序列背包求解算法”求出明文X

基於格的背包密碼

使用LLL算法對背包問題分析:

(1)構造一個格L,其基寫成矩陣形式:

\[{B_{M,S}} = \left[ {\begin{array}{*{20}{c}}
{{v_1}}\\
{{v_2}}\\
{{v_3}}\\
{...}\\
{{v_n}}\\
{{v_{n + 1}}}
\end{array}} \right] = \left[ {\begin{array}{*{20}{c}}
2&0&0&{...}&0&{{a_1}}\\
0&2&0&{...}&0&{{a_2}}\\
0&0&2&{...}&0&{{a_3}}\\
{...}&{...}&{...}&{...}&{...}&{...}\\
0&0&0&\begin{array}{l}
...\\
...
\end{array}&2&{{a_n}}\\
1&1&1&{...}&1&S
\end{array}} \right]\]

(2)設背包難題的解X = (x1,x2,.......,xn),其中xi是0或1,則格L中一定包含向量:t = (x1,x2,...,xn,-1).B = x1v1+x2v2+...+xnvn - vn+1 = (2x- 1,2x- 1,....,2xn-1 - 1,0),xi是0或1,即t的長度為$\sqrt n $,故t是一個非常短的向量,即找出L中最短非零向量,也就是還原出了明文。

NTRU

參考:鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM