NTRU

参数选择:

p为任意的正整数

f g为规定范围内的两个数,作为私钥,并满足如下条件

f<q/2 q/4<g<q/2 gcd(f,g) = 1

h为满足如下条件的一个量

h = f1g (mod q) 0 < h < q

r为选取的临时量,满足如下条件

0<m<q/4 0<r<q/2

加密

e=rh+m(modq)

解密

a = fe (mod q) m = f1a(modg)

验证

首先对a式进行化简

a=fe=f(rh+m)=f(rf1g+m)=rg+fm(modq)

根据如上对r g f m参数范围的控制,rg + fm < q

那么等式可以化简成a = rg + fm

接下来对m式进行化简

m = f1a = f1*(rg + fm) = m (mod g)

构造格子求解f g

对于式子h = f1g (mod q),进行相应的化简

h*f = g (mod q)

h*f -kq =g

构造相应的二元格子为

(1h 0q )

那么求解上述格子的LLL,即可得到(f,g)

 

背包加密系统

首先简单介绍一下子集问题

M = (M1 , M2 , M3 , ...... , Mn) 整数 S

M中的元素均为整数

从M中找到几个元素和为S的问题被称为subsum-set problem

Bob to Alice

public key M=(M1,M2,M3,,Mn)

plaintext x=(x1,x2,x3,,xn)$ 二进制字符 0 or 1

cipher S=i=1nxiMi

由于x中的元素均为二进制字符,所以此类问题可以归为subsum-set问题

solve : 在位数不多的情况下可以使用遍历爆破的形式进行求解,那么算法的时间复杂度为O(2n)

如果利用如下的碰撞算法,可以降低复杂度至一半O(2n/2)

I1<i<12n J12n<i<n

AI=iIMi BJ=SjJMJ

当存在I0J0满足AI=BJ时,I0J0即为此问题的解

S=iI0Mi+jJ0Mj

那么对于一般的背包问题,只能通过爆破的手段去进行解密,但是当M序列为超递增序列时,就可以使用格的方式进行解密

超递增序列

对于超递增序列,有两个性质

1.ri+1>ri

2.ri+1>k=1irk

在超增序列的基础上,就可以简单解密此类问题

1)xi=1 Si>Mi

  1. xi=0 Si<Mi

如果得到加密过程中的此序列,那么就可以轻松解密,为了解决这一问题出现了Merkle–Hellman算法

Merkle–Hellman

在一般的子集问题上,制定了新的公钥生成的方式

public key : Mi=Ari(modB) B>2rn gcd(A,B) = 1

encryption: $ S = x*M = \sum_{i=1}^nx_i*M_i$

decryption: S1=A1S

xr=S1

解密是需要得到超递增序列,但如果隐藏掉此序列,只给处理后的M序列,可以构造相应的格子来进行解密

[1000m10100m20000mn0000s]

GGH公钥密码系统

Hadamard比率

用于描述一组向量的正交程度

H(B)=detL|V1||V2|...|Vn|1/n

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

密钥选择

生成一组优质基v1,......vn,即Hadamard比率较高

选择一个整数矩阵U,满足det(U) = ±1

几个简单的行列式为±1的矩阵相乘得到,那么构造三角形矩阵,使对角线元素相乘为±1即可

公钥W = U*V

加密

m为明文,选取一个整数小向量

r为干扰向量,选取随机小向量,一般情况下选取3or-3

e为密文,e = m*W +r

解密

公钥W为一组劣质基,使用LLL算法将其转换为优质基v1

使用Babai算法计算出在格W上最接近e的格向量v=round(ev11)v1

明文m=vW1

或者可以利用embedded technique,将CVP转换成SVP的相关问题,可直接求解出干扰项

Nguyen's Attack

干扰项r的每一项一般会为3或者-3,基于此基础上,可以对干扰项进行缩小,简化为更简便的CVP问题

Hidden Number Problem(HNP)

hnp是格上的一个CVP问题,具体可以简化为ki=Aix+Bi(modp)问题

ki为每次使用的临时密钥,未知

AiBi为可以理解为公钥,已知

x为需要求解的私钥

为此我们构建如下的格子,l为临时密钥的bit数

[p0000p000p0B1B2Bn12l+1]

在格子中使用babai算法寻找与向量A=(A1,A2,A3,...An,0)最近的向量V

可以得到V=(xB1modp,xB2modp,,x2l+1)

那么x=V[1]2l+1

或者可以利用LLL进行x的求解,其中K为2len(k)

[pppA1A2AtK/qB1B2BtK]

对其进行LLL,可得到vk=(k1,k2,...kt,Kx/q,K)

 

LWE问题的相关学习

主要涉及的还是CVP问题的解决,作用在一个模p上,就需要给格加上一个(row*row)的p矩阵,可以通过一个例题来具体理解

题目

首先读取数据得到column为42

matrix是一个(128,42)的随机矩阵

product=(matrixsecret)modp

offset作为一个干扰向量,参与计算

result=(product+offset)modp

化简为等式r=ms+e+kp,现已知m与r,那么构造格子

[m00m10mn0m0nm1nmnnp000p0000p]

再使用babai算法对其进行求解r与此格子的最短向量b,那么也就已知ms=b,解方程即可求解s

注:矩阵p可以加在m矩阵的上面