格基礎

格的介紹

參考:連接html

數學上的定義

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

二、羣論中的定義,是 RnRn 中的知足某種性質的子集。固然,也能夠是其它羣。安全

格的研究方向 

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

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

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

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

  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指數的定型消息)

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

  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年– 格密碼逐步得以標準化

發展:3d

從前   如今
具備悠久歷史的格經典數學問題的研究
近30多年來高維格困難問題的求解算法及其計算複雜性理論研究
使用格困難問題的求解算法分析非格公鑰密碼體制的安全性 ⟹  基於格困難問題的密碼體制的設計

優點:orm

格密碼 經典密碼
量子攻擊算法 Shor算法
矩陣乘法、多項式乘法 Shor算法
Worst-case hardness Average-case hardnes
結構靈活、功能豐富 結構簡單、功能受限

格定義

簡而言之,格是n個線性無關向量的全部整係數的線性組合  

基礎知識

一、det(A)

指方陣A的行列式

二、向量範數

三、基礎區域 F

一個格L的任何基礎區域都有着相同的 「體積

下面的平行四邊形即爲一個【基礎區域F

基礎區域 F 的n維體積稱爲 L 的行列式,記爲det L

四、Hadamard 不等式

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

det L = vol(F)≤ || v1|| || v2|| .....|| vm|| ,基向量越接近垂直,等式越成立

vol(F)是F的體積

五、dim(L)

格的維度,即格的基中的向量個數

六、Hadamard比率

用於描述一組向量的正交程度

格的基 B ={v1,v2,...,vn},有

0< H(B)≤1,且越接近1,則基中的向量就越接近兩兩正交

matlab代碼實現:

 

function [result] = H(m)
% 計算一組基的Hadamard比率
% 輸入:基向量做爲行向量所構成的方陣
% 輸出:當前基的Hadamard比率
%   一、取出矩陣中的每一個行向量
%   二、按照Hadamard比率公式計算
%   三、返回計算結果
    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

 

七、格基相互轉化

格L的任意兩個基能夠經過在左邊乘上一個特定的矩陣來相互轉化,這個矩陣由整數構成,且它的行列式爲 ±1 

八、生成優質基

隨機生成知足Hadamard比率的優質基

matlab代碼實現:

 

function result = good_basis(N,v,h)
% 隨機生成一組優質基
% N是基向量的座標的絕對值上限,v是向量的個數(格的維度),h是Hadamard比率的下限
% 輸入:向量中座標的取值下限,基中向量的個數,Hadamard比率的下限
% 輸出:矩陣形式的優質基
%   一、根據取值下限和維度,隨機生成矩陣
%   二、調用H()計算Hadamard比率
%   三、若比率大於下限,則返回該矩陣,不然跳轉1
    result = unidrnd(2*N,v) - N;  %unidrnd 返回隨機方陣
    while H(result) < h
        result = unidrnd(2*N,v) - N;
    end
end

 

九、計算矩陣行範數

matlab代碼實現:

 

function [result] = row_norm(m)
%計算一個矩陣的行範式
% 輸入:矩陣形式的一組基
% 輸出:一個包含每個行向量範數的列向量
%   一、取出矩陣中的每一個行向量
%   二、計算每一個行向量的範數
%   三、返回計算結果
    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

 

十、向量正交化

施密特正交化:

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算法

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約減算法
% 輸入:矩陣形式的一組基
% 輸出:約減後的基
%   一、對輸入參數,調用LLL()
%   二、對1的結果再次調用LLL()
%   三、重複2,直到結果再也不變化
%   四、返回再也不變化的結果
    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(l,:);
        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 
相關文章
相關標籤/搜索