格密码(Lattice)与NTRUEncrypt介绍

一个例子

Python
from Crypto.Util.number import *
import gmpy2
from flag import flag

def generate():
    p = getStrongPrime(2048)
    while True:
        f = getRandomNBitInteger(1024)
        g = getStrongPrime(768)
        h = gmpy2.invert(f, p) * g % p
        return (p, f, g, h)

def encrypt(plaintext, p, h):
    m = bytes_to_long(plaintext)
    r = getRandomNBitInteger(1024)
    c = (r * h + m) % p
    return c

p, f, g, h = generate()
c = encrypt(flag, p, h)
with open("cipher.txt", "w") as f:
    f.write("h = " + str(h) + "\n")
    f.write("p = " + str(p) + "\n")
    f.write("c = " + str(c) + "\n")

生成参数

  • : 一个2048-bit的强素数 (“强”在于p-1和p+1都至少有一个很大的素因数,以防某些攻击,即 不易被分解)
  • :一个1024-bit的随机数
  • :一个768-bit的强素数
  • ,约2000bit,可以视作一个在之间的随机数
  • :1024-bit的随机数

加密

很奇怪

思路

已知,不知道

但是不知道无济于事,也许我们能找到一个等式,然后对其两边取模,借此消去r

先带着未知数化简试一试:

   同右乘f

  • : 2048-bit
  • :1024-bit
  • :768-bit
  • :1024-bit
  • :字符串转数字,一般不大于1000bit

因此有:

的bit数小于 max{ 1000 + 1024 , 768 + 1024} + 1 即2025,小于2048,故可以直接得出结论:

注意是等式),有

为了消去,我们对等式两边对取模:

故:

(注意这里的是针对来说)

这样,如果均已知,就可以求出明文

但是我们不知道

格(Lattice

给定一组线性无关的基向量 那么这些基向量的所有整系数线性组合

所形成的集合,就称作格(Lattice)

两个难题

  • SVP(最短向量问题,Shortest Vector Problem):给定lattice和基向量,找到lattice中的一个长度最短的非零向量。

低维可以利用LLL算法求解

  • CVP(最近向量问题,Closest Vector Problem):给定lattice和基向量,以及一个不在lattice上的目标向量,找到lattice中一个距离目标向量最近的格向量。
  • 他们都是NP-hard问题

回到之前的问题

其他条件都用上了,除了这个条件:

改写成等式,即:

p

(是某个常数,加减其实无所谓)

我们尝试构造一个SVP问题,构造一个矩阵M(由两个线性无关的基构成),我们希望是M张成的格上的最短向量,这样我们或许可以求出未知的

猜测与构造

先有:

可以得知在基向量张成的格上

我们再来估算一下各个向量的长度

  • : 2048-bit
  • :1024-bit
  • :768-bit
  • :2000-bit +-

可以看出的模长比起两个基向量要小的多的多的多的多···

很大概率上这个向量就是这个格的最短向量

(其实正常的逻辑应该反过来,但是无论正反向思路,这样的猜测都是是比较困难的)

二维SVP的求解:GaussLatticeReduction

上图很好理解,在一个二维线性空间中,基向量可以通过相减获得一个更短的正交向量:

(Gram-Schmidt正交化)

然而在格中,基向量的系数必须是整数,我们不妨让减去的整数倍,尽可能使得更短,如果则交换两者,否则继续。

这很容易实现,计算出后可对f,g的bit数进行验算,验证结果的正确

NTRUEncrypt

现在再来看基于此的加密算法,数字被替换成计算规则更为复杂的多项式。

NTRUEncrypt是1995年左右由Jeff Hoffstein设计,而后有Jeff, Jill Pipher与Joseph H. Silverman进一步发展起来的第一套实际使用基于格(Lattice)的密码系统。

The name "NTRU", chosen for the company and soon applied to the system as well, was originally derived from the pun Number Theorists 'R' Us or, alternatively, stood for Number Theory Research Unit

 代数结构

NTRU加密体制的基本操作建立在在多项式环上

其运算(加运算及乘运算)符合多项式的加法和乘法(运算后模多项式)。

特别规定记号:

算法描述

参数

其中素数

,是一个较大的模数

是一个较小的模数,通常取

密钥生成

随机选取两个多项式

计算

公钥:

私钥:

加密算法

按照一定编码形式生成明文多项式  均匀随机选取多项式

密文

解密算法

计算

得到

正确性:

q

 

安全性

The security of the NTRU public key cryptosystem comes from the interaction of the polynomial mixing system with the independence of reduction modulo p and q. Security also relies on the (experimentally observed) fact that for most lattices, it is very difficult to find extremely short (as opposed to moderately short) vectors.

明天接着更···

reference & more

二维SVP求解讲解:https://kel.bz/post/lll/

NTRUEwiki:https://en.wikipedia.org/wiki/NTRUEncrypt

更详细的更专业LLL介绍:https://zhuanlan.zhihu.com/p/336840687

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值