第二十四个知识点:描述一个二进制m组的滑动窗口指数算法
第二十四个知识点:描述一个二进制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组的滑动窗口指数算法的更多相关文章
- 第二十六个知识点:描述NAF标量乘法算法
第二十六个知识点:描述NAF标量乘法算法 NAF标量乘法算法是标量乘法算法的一种增强,该算法使用了非邻接形式(Non-Adjacent Form)表达,减少了算法的期望运行时间.下面是具体细节: 让\ ...
- 第三十四个知识点:描述攻击离散对数问题的baby-step/Giant-step方法
第三十四个知识点:描述攻击离散对数问题的baby-step/Giant-step方法 Baby-step/Giant-step是Dnaiel Shanks为解决DLP问题开发的算法.DLP问题已经是许 ...
- 第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法
第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-44-d ...
- 第二十八个知识点:什么是公钥密码学的IND-CCA安全定义?
第二十八个知识点:什么是公钥密码学的IND-CCA安全定义? 我们将在这篇博客中讨论公钥加密的IND-CCA安全. IND-CCA安全代表选择明文的不可伪造性.这样的安全方案的思想就是给定一个密文,攻 ...
- NeHe OpenGL教程 第二十四课:扩展
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- javaSE第二十四天
第二十四天 363 1:多线程(理解) 363 (1)JDK5以后的Lock锁 363 A:定义 363 B:方法: 364 C:具体应用(以售票程序为例) 364 ...
- Gradle 1.12用户指南翻译——第二十四章. Groovy 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 第二十五个知识点:使用特殊的素数定义$GF(p)$和$GF(2^n)$的方法。
第二十五个知识点:使用特殊的素数定义\(GF(p)\)和\(GF(2^n)\)的方法. 在我们之前看到的博客中,当实现密码学方案时,一个最频繁调用的操作就是模运算.不幸的是,尽管模块化的使用非常广泛, ...
- SQL注入之Sqli-labs系列第二十四关(二阶注入)
开始挑战第二十四关(Second Degree Injections) 0x1 前言 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 .二次注入不是注入两次的意思,请不要混淆 ...
随机推荐
- 巩固javaweb第十八天
提交按钮 只要涉及提交信息,都应该提供一个提交按钮,当点击提交按钮的时候,用户输入的 信息将提交给服务器,意味着输入过程的结束.注册界面中也包含一个提交按钮. 提交按钮的基本格式如下: <inp ...
- day07 Linux配置修改
day07 Linux配置修改 昨日回顾 1.系统目录 /etc :系统配置目录 /bin-> /usr/bin :保存常用命令的目录 /root :超级管理员目录 /home :普通管理员目录 ...
- postgresql安装部署
一.下载安装: 1.下载: 官网下载地址:https://www.postgresql.org/download/linux/redhat/ 也可以用这个:https://www.enterprise ...
- HDFS初探之旅(一)
1.HDFS简介 ...
- Android给页面添加横线和竖线
竖线 <View android:layout_width="1dip" android:layout_height="match_parent& ...
- 【Linux】【Shell】【text】文本处理工具
文本查看及处理工具:wc, cut, sort, uniq, diff, patch wc:word count wc [OPTION]... [FILE]... -l: lines -w:words ...
- 2、Redis的安装
一.Windows下Redis安装 下载地址 Redis中文网站 Github地址 1.将下载下来的文件解压到目录 2.双击redis-server.exe运行 出现如下界面证明运行成功 3.双击 ...
- Nginx日志分析脚本
目录 一.简介 二.脚本 一.简介 运维工作是一个比较复杂的工作,有时候面对上万条的日志,如何作分析?难道一条条的分析? 这估计看两眼就要打哈欠了吧?聪明的人会选择脚本,这就是为什么现在提倡自动化运维 ...
- 有了代码变更分解提交工具SmartCommit,再也不担心复合提交了
摘要:文将介绍一个代码提交辅助工具SmartCommit,其主要功能是通过杂糅变更分解算法自动生成分组提交方案,接受开发者的反馈和交互式调整,渐进式地引导和辅助开发者做出符合最佳实践的原子提交. 本文 ...
- 一个使用 asyncio 开发的网络爬虫(译文)
原文地址:https://www.aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html 作者简介 A. Jesse Jiryu ...