第二十五个知识点:使用特殊的素数定义$GF(p)$和$GF(2^n)$的方法。
第二十五个知识点:使用特殊的素数定义\(GF(p)\)和\(GF(2^n)\)的方法。
在我们之前看到的博客中,当实现密码学方案时,一个最频繁调用的操作就是模运算。不幸的是,尽管模块化的使用非常广泛,但是它不能像其它算术运算(如加法和乘法)那样容易的执行。蒙哥马利表达提供了一种解决方案,这里我们讨论另一种解决方法——伪梅森素数规约。
定义:如果一个素数\(p\)被写成如下形式,那么就称\(p\)位伪梅森素数。其中\(b=2,c=1\)时就是梅森素数。
\]
实际上,\(b\)总是2,我们选择\(c\)通常是32位或者64位。
通过定义很容易推导出
b^n \equiv c \mod p
\]
因此给定一个\(k\)位的整数\(z\),我们让\(z^{'}\)为最低\(n\)位有效位,\(z^{''}\)是高\(k-n\)位有效位,就有\(z = z^{''}2^n+z^{'}\),然后我们能重写\(z \mod p\)为
\]
重复的计算上述式子,就可以得到\(z \mod p\)的值,这个值在\(Z_p\)中。(\(Z_p\)就是模\(p\)的完全剩余系。)
下面有些需要注意的点:
1.\(z^{'}\)和\(z^{''}\)都能够通过简单的移位运算获得。
2.因为\(c\)被选择是一个字的长度,那么乘法计算会变得容易。
3.每次迭代会减少\(k\)的值。得到的值会是\(max(k-n+w,n)\)。
因此一般来说,计算伪梅森素数的约减将会仅仅需要移位,加法和乘法。
然而,使用这种方法的缺点也很明显,因为这种实现通常需要多方使用固定的设置,这可能会导致互操作性和安全性问题。更多的细节参考[1]和[2]。
\(GF(2^n)\)是另外一个经常被用到的域。
三项式和五项式是这个领域中最长用到的模。我们将会展示三项式如果简化约减。相同的技术亦可以直接用于五项式。
这个想法和素数域的那个非常类似。假设我们有三项式\(f(x) = x^n+x^t+1\),其中 $ 0<t<n/2 $。
我们立刻就有
\]
给定多项式\(z(x)\)的次数大于\(n\)。我们把\(z(n)\)写成
\]
其中,\(z^{'}(x)\)是\(z(x)\)的最低\(n\)位,\(z^{''}(x)\)是剩下的位数。
然后我们就像在GF(p)中那样,我们计算模数通过:
\equiv z^{''}(x)x^t+z^{''}(x)+z^{'}(x) \mod f(x)
\]
这个运算因为\(t\)是一个更小的数使得它变得简单了。
[2]中也描述了标准规约的另一个优化。考虑到标准的例程会规约\(z(x)\) 的次数\(m\)而不是\(f(x)\)的次数\(n\):
f(x) = x^n+x^t+1
\]
当我们尝试规约\(a_ix^i\),有下面两种情况:
- 如果\(a_i=0\),那么就不用规约
- 如果\(a_i=1\),1就可以进行对齐,提出一个这样的元素\(a_{i-n+t}\)和\(a_{i-n}\)。
因为添加\(0\)不会改变余数,这两种情况可以被一般化,因此我们能写下如下的标准规约程序:
Input:\(z(x)\)
Output:\(z(x)\)
1.for \(i=m\) to \(n\) by -1
2.{
3.\(a_{i-n+t}+=a_i\)
4.\(a_{i-n}+=a_i\)
5.}
使用这样算法的在软件上的优化不是明显的。但是在硬件上的优化是明显的,同时仅仅更新了\(z(x)\),不需要额外的存储。
另外一个优点就是这样的形式仅仅需要$ 0<t<n $,它能被在常量时间内执行。
[1]Menezes, Alfred J., Paul C. Van Oorschot, and Scott A. Vanstone. Handbook of applied cryptography. CRC press, 1996.
[2]Blake, Ian F., Gadiel Seroussi, and Nigel Smart. Elliptic curves in cryptography. Vol. 265. Cambridge university press, 1999.
第二十五个知识点:使用特殊的素数定义$GF(p)$和$GF(2^n)$的方法。的更多相关文章
- 第二十八个知识点:什么是公钥密码学的IND-CCA安全定义?
第二十八个知识点:什么是公钥密码学的IND-CCA安全定义? 我们将在这篇博客中讨论公钥加密的IND-CCA安全. IND-CCA安全代表选择明文的不可伪造性.这样的安全方案的思想就是给定一个密文,攻 ...
- NeHe OpenGL教程 第二十五课:变形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- javaSE第二十五天
第二十五天 399 1:如何让Netbeans的东西Eclipse能访问. 399 2:GUI(了解) 399 (1)用户图形界面 399 (2)两个包: 399 (3) ...
- Gradle 1.12用户指南翻译——第二十五章. Scala 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- SQL注入之Sqli-labs系列第二十五关(过滤 OR & AND)和第二十五A关(过滤逻辑运算符注释符)
开始挑战第二十五关(Trick with OR & AND) 第二十五关A(Trick with comments) 0x1先查看源码 (1)这里的or和and采用了i正则匹配,大小写都无法绕 ...
- “全栈2019”Java多线程第二十五章:生产者与消费者线程详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课
centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节 ...
- “全栈2019”Java第二十五章:流程控制语句中循环语句while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 孤荷凌寒自学python第二十五天初识python的time模块
孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...
随机推荐
- 学习java第十九天
一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...
- 日常Java 2021/10/19
Java集合框架 Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射. Collection接口又有3种子类型,Li ...
- day05 django框架之路由层
day05 django框架之路由层 今日内容概要 简易版django请求声明周期流程图(重要) 路由匹配 无名有名分组 反向解析 无名有名解析 路由分发 名称空间 伪静态 虚拟环境 简易版djang ...
- 数仓day02
1. 什么是ETL,ETL都是怎么实现的? ETL中文全称为:抽取.转换.加载 extract transform load ETL是传数仓开发中的一个重要环节.它指的是,ETL负责将分布的. ...
- Nginx流量拷贝
1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...
- When do we use Initializer List in C++?
Initializer List is used to initialize data members of a class. The list of members to be initialize ...
- 【Linux】【Shell】【text】Vim
文本编辑器: 文本:纯文本,ASCII text:Unicode: 文本编辑种类: 行编辑器:sed 全屏编辑器:nano, vi vi: Visual Interface vim: Vi IMpro ...
- apply 和 call 的区别
相同点: 都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行 不同点: call方法从第二个参数开始可以接收任意个参数,每个参数会映射到相应位置的func的参 ...
- 13.Vue.js 组件
组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽 ...
- MySQL5.7安装教程(亲测有效)
跟着狂神学java到了数据库阶段了,首先得安装好数据库啊,这里用的是MySQL 压缩包下载:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5. ...