格密码基础:SIS问题的困难性

目录

一. SIS问题的困难性

二. SIS问题归约的性质

2.1 2004年 [MR04]

2.2 2008年 【GPV08】

2.3 2013年【MP13】

三. 归约证明

3.1 核心理解

3.2 归约步骤

3.3 性质理解


一. SIS问题的困难性

推荐先阅读:

格密码基础:SIS问题的定义与理解-CSDN博客

借鉴1996年Ajtai的工作,大量的工作开始研究最坏情况下的SIS问题的困难性。SIS问题中一共有四个参数n,q,\beta,m,需要满足如下:

m=poly(n)\quad \beta>0\quad q>\beta\cdot poly(n)

如果能以不可忽略的概率解决SIS问题,那么就可以在随机的n维格上,解决近似GapSVP和SIVP问题。此处的近似因子取值为:

\gamma=\beta\cdot poly(n)

GapSVP:decisional approximate shortest vector problem,判定性近似最短向量问题

SIVP: approximate shortest indenpendent vectors problem

需要注意的是m和q的值会极大影响SIS问题的困难性,而且根据归约准则,当范数上限\beta值越大时,GapSVP和SIVP问题的近似因子也会变大。整个多项式时间复杂度的归约分成两步:

  1. 假设存在一个oracle可以解决SIS问题
  2. 利用此oracle尝试在任意n维格上解决近似的GapSVP和SIVP问题

二. SIS问题归约的性质

理论上,我们希望归约时的模q和近似因子(approximation factor)\gamma越小越好,因为这样可以产生更小的实例(instance)和密码学的公私钥,以及更强的网络安全性保证。接下来,我们来看几个SIS问题归约时重要的发展历程:

2.1 2004年 [MR04]

在2004年,Micciancio 和 Regev引入了格上高斯分布和调和分析(harmonic analysis),从而导出了格密码中重要的概念,叫做光滑参数(smoothing parameter),写做:

\eta(L)

如果在格点周围外加一个噪声,该噪声分布服从高斯分布。当分布的方差大于格的光滑参数时,离散的格点就可以变成连续的均匀分布。对于光滑参数有一种直观的形式化语言,如下:

The amount of Gaussian error needed to “smooth out” the discrete structure of a lattice.

借助此理论便可以产生均匀且随机的SIS实例,从而对任意输入的格均满足推论。在此论文中,近似因子的取值为:

\gamma=\beta\cdot \tilde O(\sqrt n)

当选择合适的\beta值时,近似因子可取:

\gamma=\tilde O(n)

此时模q可取:

q=\beta\cdot \tilde O(n\sqrt m)

可以看到以上两者的取值都相对较小。

2.2 2008年 【GPV08】

在2008年,Gentry, Peikert 和Vaikuntanathan将模数q的值优化到:

q=\beta\cdot \tilde O(\sqrt n)

此时的近似因子与2004年的工作类似:

\gamma=\beta\cdot \tilde O(\sqrt n)

此论文创新性提出了离散高斯分布(discrete Gaussian),待会我们会简单分析此理论。

2.3 2013年【MP13】

在2013年,Micciancio 和 Peikert将模数q优化到:

q=\beta\cdot n^\epsilon

其中\epsilon为大于0的常数。

如果把n^\epsilon看成固定的常数的话,此时的q已经是最优的了。因为SIS问题中,总存在平凡解就是q。

借助卷积引理(convolution lemma),在利用SIS的oracle进行归约时,此理论需要使用到l_\infty范数,而不是常规的l_2范数。

三. 归约证明

SIS问题的困难性涉及到最坏情况和平均情况(worst case/average case)的归约证明。该归约的思路:给定任意n维格L的格基B,已知一个平均情况的SIS的oracle,目标是解决SIVP问题。

在这里简单解释下近似的SIVP问题:

给定近似因子\gamma=poly(n),尝试找出n个线性独立的格向量,它们的长度都小于:

\gamma\cdot \lambda_n(L)

3.1 核心理解

首先输入格基B,从此格中随机选择一部分独立的格向量S,也就是:

S\subseteq L

将此处的S看成一个矩阵。接着利用SIS oracle不断对该矩阵进行归约运算,使其长度至少缩短一半以上,也就是:

||S'||\leq \frac{||S||}{2}

备注:此处矩阵的长度代表其中最长向量的长度,也就是:

||X||=max_i||x_i||\quad X=\lbrace x_i\rbrace

不断迭代重复,直到最终的结果符合SIVP问题的要求。

3.2 归约步骤

第一步:取样

借助格L上的离散高斯分布,采样出m个随机的格点,形成集合S,也就是:

v_i\in L

这些初始向量不会太长。接着将这m个向量形成矩阵V

第二步:形成SIS oracle的输入

运算得到:

a_i=B^{-1}v_i\quad mod\ qZ^n

重复运算m次,由此可得:

A=B^{-1}V\quad mod\ qZ^{n\times m}

需要注意的是,因为v_i是格点,所以B^{-1}v_i一定是整数的。

接着从此时的矩阵A输入到SIS的oracle中。

第三步:运算

SIS的oracle会输出一个解,也就是:

z\in Z^m

那么可得:

v=Vz/q

很明显发现此时的向量长度在变小。

3.3 性质理解

(1)SIS oracle分析

根据以上归约过程,给定一个矩阵A,z为其SIS问题的答案。因为v_i是格点,所以可得:

v_i=Ba_i\quad mod\ qL

由此可运算:

所以可得以下运算出的v为L格点:

v=Vz/q\in L

SIS求解出的z长度是有上限的,也就是:

||z||\leq \beta

在产生向量v时,使其满足:

||v_i||\leq ||S||\cdot poly(n)

两者结合可得:

||Vz||\leq ||S||\cdot \beta\cdot poly(n)

当我们选择模数q如下:

q=\beta\cdot poly(n)

即可以得到:

||v||=||Vz||/q\leq ||S||/2

第一轮迭代完成。

(2)矩阵A均匀分布

借助光滑参数,v_i在一定条件下均匀分布:

\gamma\geq \beta\cdot poly(n)\geq q

也就是:

v_i\quad mod\ qL\quad L/qL

此处说明v在模qL上为均匀分布,再根据:

a_i=B^{-1}v_i

B是确定的,也就是a和v之间是双射运算,所以可得矩阵A也是均匀分布(严格来讲应该是跟均匀分布不可区分)。

  • 33
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用SIS模型检验节点重要性的Python案例: ``` import networkx as nx import random # 生成一个随机图 G = nx.gnm_random_graph(100, 500) # 设置每个节点的传染率和恢复率 for node in G.nodes(): G.nodes[node]['beta'] = random.uniform(0, 1) G.nodes[node]['gamma'] = random.uniform(0, 1) # 定义SIS模型的演化函数 def sis_model(G, beta, gamma, initial_infected, num_steps): infected = set(initial_infected) for i in range(num_steps): new_infected = set() for node in G.nodes(): if node in infected: # 对每个感染节点,以beta的概率传染它的邻居 for neighbor in G.neighbors(node): if random.random() < beta and neighbor not in infected: new_infected.add(neighbor) else: # 对每个未感染节点,以gamma的概率让它恢复 if random.random() < gamma: new_infected.add(node) infected |= new_infected return infected # 对每个节点进行影响力评估 scores = {} for node in G.nodes(): initial_infected = [node] final_infected = sis_model(G, G.nodes[node]['beta'], G.nodes[node]['gamma'], initial_infected, 10) scores[node] = len(final_infected) # 输出前十个影响力最大的节点 rank = sorted(scores.items(), key=lambda x: x[1], reverse=True) for i in range(10): print(rank[i]) ``` 以上代码中,我们首先生成一个包含100个节点、500条边的随机图,然后为每个节点设置传染率beta和恢复率gamma。接着,我们定义了一个名为sis_model()的函数,用于模拟SIS模型的演化过程,并返回最终感染的节点集合。在模拟过程中,我们以每个节点为初始感染点,运行10轮模拟,并记录最终感染的节点数作为该节点的影响力评分。 最后,我们对所有节点进行影响力评估,并输出影响力最大的前十个节点。这样,我们就可以快速得到对网络影响最大的节点,以便进行后续的分析和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唠嗑!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值