目录
NTRU
参数选择:
p为任意的正整数
f g为规定范围内的两个数,作为私钥,并满足如下条件
h为满足如下条件的一个量
h =
r为选取的临时量,满足如下条件
加密
解密
a = fe (mod q) m =
验证
首先对a式进行化简
根据如上对r g f m参数范围的控制,rg + fm < q
那么等式可以化简成a = rg + fm
接下来对m式进行化简
m =
构造格子求解f g
对于式子h =
h*f = g (mod q)
h*f -kq =g
构造相应的二元格子为
那么求解上述格子的LLL,即可得到(f,g)
背包加密系统
首先简单介绍一下子集问题
M = (M1 , M2 , M3 , ...... , Mn) 整数 S
M中的元素均为整数
从M中找到几个元素和为S的问题被称为subsum-set problem
Bob to Alice
public key
plaintext
cipher
由于x中的元素均为二进制字符,所以此类问题可以归为subsum-set问题
solve : 在位数不多的情况下可以使用遍历爆破的形式进行求解,那么算法的时间复杂度为
如果利用如下的碰撞算法,可以降低复杂度至一半
当存在
那么对于一般的背包问题,只能通过爆破的手段去进行解密,但是当M序列为超递增序列时,就可以使用格的方式进行解密
超递增序列
对于超递增序列,有两个性质
1.
2.
在超增序列的基础上,就可以简单解密此类问题
1)
如果得到加密过程中的此序列,那么就可以轻松解密,为了解决这一问题出现了Merkle–Hellman算法
Merkle–Hellman
在一般的子集问题上,制定了新的公钥生成的方式
public key :
encryption: $ S = x*M = \sum_{i=1}^nx_i*M_i$
decryption:
解密是需要得到超递增序列,但如果隐藏掉此序列,只给处理后的M序列,可以构造相应的格子来进行解密
GGH公钥密码系统
Hadamard比率
用于描述一组向量的正交程度
0< H(B)≤1,且越接近1,则基中的向量就越接近两两正交
密钥选择
生成一组优质基
选择一个整数矩阵U,满足det(U) = ±1
几个简单的行列式为±1的矩阵相乘得到,那么构造三角形矩阵,使对角线元素相乘为±1即可
公钥W = U*V
加密
m为明文,选取一个整数小向量
r为干扰向量,选取随机小向量,一般情况下选取3or-3
e为密文,e = m*W +r
解密
公钥W为一组劣质基,使用LLL算法将其转换为优质基
使用Babai算法计算出在格W上最接近e的格向量
明文
或者可以利用embedded technique,将CVP转换成SVP的相关问题,可直接求解出干扰项
Nguyen's Attack
干扰项r的每一项一般会为3或者-3,基于此基础上,可以对干扰项进行缩小,简化为更简便的CVP问题
Hidden Number Problem(HNP)
hnp是格上的一个CVP问题,具体可以简化为
为此我们构建如下的格子,l为临时密钥的bit数
在格子中使用babai算法寻找与向量
可以得到
那么
或者可以利用LLL进行x的求解,其中K为
对其进行LLL,可得到
LWE问题的相关学习
主要涉及的还是CVP问题的解决,作用在一个模p上,就需要给格加上一个(row*row)的p矩阵,可以通过一个例题来具体理解
题目
xxxxxxxxxx
import numpy as np
from secret import *
def random_offset(size):
x = np.random.normal(0, 4.7873, size)
return np.rint(x)
secret = np.array(list(flag))
column = len(list(secret))
row = 128
prime = 2129
matrix = np.random.randint(512, size=(row, column))
product = matrix.dot(secret) % prime
offset = random_offset(size=row).astype(np.int64)
result = (product + offset) % prime
np.save("matrix.npy", matrix)
np.save("result.npy", result)
首先读取数据得到column为42
matrix是一个(128,42)的随机矩阵
offset作为一个干扰向量,参与计算
化简为等式
再使用babai算法对其进行求解r与此格子的最短向量b,那么也就已知
注:矩阵p可以加在m矩阵的上面