第三十六个知识点:Index Calculus算法
第三十六个知识点:Index Calculus算法
我们这篇博客继续描述一种数学攻击,这种数学攻击被叫做Index Calculus(IC)算法。
注意这里Index Calculus算法没有找到合适的中文翻译。因为原文不是很通顺,我加入了很多自己的话。
我们要做什么
Index Calculus攻击是一种企图解决DLP(离散对数问题)的方法。简单来说,算法把目标值写成在因子基数上的元素幂的乘积,对数已知的元素,然后利用对数定律提取目标值。我们现在详细的解释刚才那句话是什么意思。
算法工作原理
该算法能被用于在群\(G = \langle g \rangle\)中任何的元素\(h\)。我们将会依赖这样的命题:如果\(x^ay^bz^c = 1\),那么\(a*\log_g{x}+b*\log_g{y}+c*\log_g{z} = \log_g{1} = 0\)。因此,如果我们能发现一些\(x_i\),且\(L_i = \log_g{x_i}\),\(h = x_1^{a_1}...x_r^{a_r}\),然后我们有\(\log_gh = a_1*L_1+...+a_r*L_r\)。IC算法就是利用了这一点,攻击的效率取决于各个阶段的执行速度。为了上下文,除了一般的技术,我们还会用群\(Z/pZ\)上的离散对数问题作为例子。由于懒惰,我们将用词汇离线计算和预计算都指的是每个群只需要做一次的工作。类似的,在线的和每次的工作指的是每个DLP问题都需要做的。
(预计算,非常的快)选择一个因子基数
因子基数是一些元素\(b_0 = g,b_1,...,b_r \in G\)。如何选择它们和选择多少取决于我们研究的群和后面的步骤运行的时间。实际上,简单的选择\(r\)通常导致一个低效的在线计算(小\(r\))和离线(大\(r\))计算的效率权衡。在我们的例子中,我们通常选择-1和前\(r\)个素数。因为这会让我们的在线计算更有效率。这个\(r\)是我们选择因子基数的数量。
最后得到的结果是这样的:{−1,2,3,5,7,11,...,\(p_r\)}共r+1个因子基数。
(预计算,昂贵的但是可以并行)找出因子基数和DLP问题之间的关系
用一些技术(光滑数优化过的整数分解算法)来获取这样的关系:\(g^k \mod q = (-1)^{e_0}2^{e_1}3^{e_2}...p_r^{e_r}\)。我们找到了用不同的因子基数表示的方程它们相互关联。通过取对数,我们可以转换为线性关系。我们继续搜索直到找到r个关系,r越大我们需要的时间越多。也就是说,通过简单地要求每个进程独立搜索,然后合并结果集,可以很容易地并行完成。我们的例子就是这样工作的。说白了就是取不同的k,所以可以并行计算。
(预计算,相对有效率)求因子基数的DLP结果
我们对这\(r+1\)个因子基数解决离散对数问题。因为之前的矩阵,我们直接就知道了如何求解这个问题。因为\(log_g(g) = 1\)是预先知道的。我们有了r+1个等价关系。我们需要一个矩阵求解器即可。
(在线的,昂贵的)把\(h\)写成因子基数的乘积
我们尝试找到\(y\)和列表\(a_i\)使得\(hg^y = b_1^{a_1}...b_r^{a_r}\)。这个也可以并行的计算,通过尝试\(y\)值。如果我们尝试成功,我们立刻可以得到:
现在,我们在前一个阶段忽略了一个大问题,如何找到\(y\)?实际上我们的例子不算太坏。因为因子基数都是小素数,我们可以简单的尝试分解\(hg^y\)通过除法这样的技术。然而在其它群中,这可能是困难的不切实际的。
一个简要的总结
因此,Index Calculus算法通过离散对数转化为和的形式找出离散对数的结果。它通过建立一个已知的表(因子基数库)来解决这个问题,然后找到一个与目标相关的等式将目标写成这种形式。因此,该算法非常通用,通过改变因子基数r的大小,可以恢复一些明显的经典攻击。然而选择\(r\)的值使得每个阶段都可以有效的完成通常是不可能的,因此要么离线计算会很难,要么在线计算会很难(或者都很难)。