第三十六个知识点: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\)值。如果我们尝试成功,我们立刻可以得到:

\[\log_g(h) = -y + L_1a_1 + \dots + L_r a_r
\]

现在,我们在前一个阶段忽略了一个大问题,如何找到\(y\)?实际上我们的例子不算太坏。因为因子基数都是小素数,我们可以简单的尝试分解\(hg^y\)通过除法这样的技术。然而在其它群中,这可能是困难的不切实际的。

一个简要的总结

因此,Index Calculus算法通过离散对数转化为和的形式找出离散对数的结果。它通过建立一个已知的表(因子基数库)来解决这个问题,然后找到一个与目标相关的等式将目标写成这种形式。因此,该算法非常通用,通过改变因子基数r的大小,可以恢复一些明显的经典攻击。然而选择\(r\)的值使得每个阶段都可以有效的完成通常是不可能的,因此要么离线计算会很难,要么在线计算会很难(或者都很难)。

第三十六个知识点:Index Calculus算法的更多相关文章

  1. 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)

    风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...

  2. 第二十六个知识点:描述NAF标量乘法算法

    第二十六个知识点:描述NAF标量乘法算法 NAF标量乘法算法是标量乘法算法的一种增强,该算法使用了非邻接形式(Non-Adjacent Form)表达,减少了算法的期望运行时间.下面是具体细节: 让\ ...

  3. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  4. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. Java进阶(三十六)深入理解Java的接口和抽象类

    Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...

  6. Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  7. 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础

    第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...

  8. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  9. “全栈2019”Java第三十六章:类

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. 巩固javaweb第十二天

    巩固内容: HTML 图像- 图像标签( <img>)和源属性(Src) 在 HTML 中,图像由<img> 标签定义. <img> 是空标签,意思是说,它只包含属 ...

  2. 《Scala编程》课程作业

    第一题.百元喝酒 作业要求:每瓶啤酒2元,3个空酒瓶或者5个瓶盖可换1瓶啤酒.100元最多可喝多少瓶啤酒?(不允许借啤酒) 思路:利用递归算法,一次性买完,然后递归算出瓶盖和空瓶能换的啤酒数 /** ...

  3. 编程之美Q1

    题目 和数书页有点类似,就直接数吧 #include<iostream> using namespace std; class q1 { public: size_t func(size_ ...

  4. Oracle中的加解密函数

    对Oracle内部数据的加密,可以简单得使用DBMS_CRYPTO来进行,效果还是不错的,而且使用也比较方便,所以今天专门来学习一下这个包的使用方法.在使用之前,要注意两件事情: 1.DBMS_CRY ...

  5. 实现将rsyslog将日志记录与MySQL中

    准备两个节点 node3:  rsyslog node2:   数据库 准备相应的包 [root@node3 php-fpm.d]#yum install rsyslog-mysql 将数据拷贝到数据 ...

  6. 单元测试(Jest 和 Mocha)

    Vue CLI 拥有通过 Jest 或 Mocha 进行单元测试的内置选项. Jest 是功能最全的测试运行器.它所需的配置是最少的,默认安装了 JSDOM,内置断言且命令行的用户体验非常好.不过你需 ...

  7. js格式化合计金额

    var summoney=1040.010400000000000001; var totalMoney=parseFloat(summoney).toFixed(2); var arry=total ...

  8. 【Java多线程】CompletionService

    什么是CompletionService? 当我们使用ExecutorService启动多个Callable时,每个Callable返回一个Future,而当我们执行Future的get方法获取结果时 ...

  9. eclipse.ini配置 vmargs 说明

    -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数, ...

  10. 1.Java语言基础

    一:java语言介绍 (1). 1991年出现,1995年5月正式发布 出生地:SUN  创始人:James Gosling  2009年4月被Oracle收购 目前最新的版本2018年3月v10.0 ...