第二十四个知识点:描述一个二进制m组的滑动窗口指数算法

简单回顾一下我们知道的。

大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法。因此,现代密码学需要大指数模幂算法的有效实现。我们应该从一个简化的方案开始思考:计算\(x^a\mod N\),我们可以用指数算法来求\(x^a\),然后再约减到\(N\)。然而,对大多数密码算法来说,\(x^a\)都是非常大的。现在,大多数传统的方法能被简单的在每个阶段模\(N\)。这回产生一些改进的技术。下面我会介绍一些计算\(X^E \mod N\)可能的方法。

二进制算法

二进制模幂算法和传统的求幂的二次方方法非常像。实际上,唯一的不同就是我们把\(N\)表示成二进制形式然后计算。我们从左向右计算或者从右向左计算。

m-ary

m-ary方法也相似,但是它把指数看成位序列,然后把它们堪称\(M = 2^m\)的元素。实际上,二进制方法被认为是一种m-ary方法在\(M = 2\)时刻的情况。那么它如何工作呢?首先我们对所有的\(X^i\),其中\(i = 1\)到\(2^m-1\),计算一个查找表。然后我们通过基于\(M\)的指数\(E\)的算法。然后我们每次计算的值只是才表中查找而不是移动m位。

这个方法和二进制算法进行比较,意味着我们能提前计算很多东西,然后做更少的乘法。

滑动窗口

因此,m-ary窗口会约减我们计算乘法的次数,但是我们可以做的更好吗?答案是对的。假设我们令\(m = 4\),同时\(E = 22 = (0,0,0,1,0,1,1,0)_2 = (1,6)_{2^4}\)。然后我们用4-ary算法,但是如果我们重新规定窗口大小的话,我们能做的更好:这里只有三个1,但是我们却用一个4-ary的算法。如果我们提前知道,我们就可以用我们的查找表来计算了,同时只需要一次查找。因此滑动窗口的话,我们首先对\(E\)做一个变换成\(E = \sum x_i2^i\)。这里让\(x_i\)尽可能是0。这回导致更多的预先运算,但是同时也提升了具体运算的效率。

参考

https://zh.wikipedia.org/wiki/平方求幂

第二十四个知识点:描述一个二进制m组的滑动窗口指数算法的更多相关文章

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

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

  2. 第三十四个知识点:描述攻击离散对数问题的baby-step/Giant-step方法

    第三十四个知识点:描述攻击离散对数问题的baby-step/Giant-step方法 Baby-step/Giant-step是Dnaiel Shanks为解决DLP问题开发的算法.DLP问题已经是许 ...

  3. 第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法

    第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-44-d ...

  4. 第二十八个知识点:什么是公钥密码学的IND-CCA安全定义?

    第二十八个知识点:什么是公钥密码学的IND-CCA安全定义? 我们将在这篇博客中讨论公钥加密的IND-CCA安全. IND-CCA安全代表选择明文的不可伪造性.这样的安全方案的思想就是给定一个密文,攻 ...

  5. NeHe OpenGL教程 第二十四课:扩展

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

  6. javaSE第二十四天

    第二十四天    363 1:多线程(理解)    363 (1)JDK5以后的Lock锁    363 A:定义    363 B:方法:    364 C:具体应用(以售票程序为例)    364 ...

  7. Gradle 1.12用户指南翻译——第二十四章. Groovy 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  8. 第二十五个知识点:使用特殊的素数定义$GF(p)$和$GF(2^n)$的方法。

    第二十五个知识点:使用特殊的素数定义\(GF(p)\)和\(GF(2^n)\)的方法. 在我们之前看到的博客中,当实现密码学方案时,一个最频繁调用的操作就是模运算.不幸的是,尽管模块化的使用非常广泛, ...

  9. SQL注入之Sqli-labs系列第二十四关(二阶注入)

    开始挑战第二十四关(Second Degree Injections) 0x1 前言 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 .二次注入不是注入两次的意思,请不要混淆 ...

随机推荐

  1. 学习java 7.6

    学习内容: 方法重写注意事项:子类不能重写父类的私有方法 子类的访问权限不比父类的低(父类默认,子类可以是默认也可以是public) java中继承的注意事项:java中类只支持单继承,java中类支 ...

  2. Go知识盲区--闭包

    1. 引言 关于闭包的说明,曾在很多篇幅中都有过一些说明,包括Go基础--函数2, go 函数进阶,异常与错误 都有所提到, 但是会发现,好像原理(理论)都懂,但是就是不知道如何使用,或者在看到一些源 ...

  3. Spark 广播变量和累加器

    Spark 的一个核心功能是创建两种特殊类型的变量:广播变量和累加器 广播变量(groadcast varible)为只读变量,它有运行SparkContext的驱动程序创建后发送给参与计算的节点.对 ...

  4. ORACLE dba_extents

    dba_extents OWNER 拥有者 SEGMENT_NAME 段名 PARTITION_NAME 分区名 SEGMENT_TYPE 段类型 TABLESPACE_NAME 表空间名 EXTEN ...

  5. 【Linux卷管理】LVM原理

    LVM 简介 每个Linux使用者在安装Linux时 都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能 ...

  6. @Conditional 注解,基于条件实例对象

    .catalogue-div { position: relative; background-color: rgba(255, 255, 255, 1); right: 0 } .catalogue ...

  7. 使用$.post方式来实现页面的局部刷新功能

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. 记一次SQL Server insert触发器操作

    需求:在河道水情表(ST_RIVER_R )新增插入数据时,更新实时数据表(SS_data) 中关联字段的值. 需求概括下:当A表中新增数据时,同时更新B表中的某字段 代码如下: USE [DBCNB ...

  9. JavaScript对象之面向对象

    在js中创建对象的两种方式 1.new一个Objecteg: var flower = new Object(); flower.stuname = "呵呵"; flower.ag ...

  10. spring security oauth2 搭建认证中心demo

    oauth2 介绍 ​ oauth2 协议应该是开发者们耳熟能详的协议了,这里就不做过多的介绍了,具体介绍如何在spring security中搭建oauth2的认证服务.Spring-Securit ...