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

在我们之前看到的博客中,当实现密码学方案时,一个最频繁调用的操作就是模运算。不幸的是,尽管模块化的使用非常广泛,但是它不能像其它算术运算(如加法和乘法)那样容易的执行。蒙哥马利表达提供了一种解决方案,这里我们讨论另一种解决方法——伪梅森素数规约。

定义:如果一个素数\(p\)被写成如下形式,那么就称\(p\)位伪梅森素数。其中\(b=2,c=1\)时就是梅森素数。

\[P = b^n-c,其中0<|c|<2^{n/2}
\]

实际上,\(b\)总是2,我们选择\(c\)通常是32位或者64位。

通过定义很容易推导出

\[p \equiv b^n-c \equiv 0 \mod p \\
b^n \equiv c \mod p
\]

因此给定一个\(k\)位的整数\(z\),我们让\(z^{'}\)为最低\(n\)位有效位,\(z^{''}\)是高\(k-n\)位有效位,就有\(z = z^{''}2^n+z^{'}\),然后我们能重写\(z \mod p\)为

\[z \equiv z^{''}b^n+z{'} \equiv z^{''}c+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 $。

我们立刻就有

\[x^n \equiv x^t +1 \mod f(x)
\]

给定多项式\(z(x)\)的次数大于\(n\)。我们把\(z(n)\)写成

\[z(x) = z^{''}(x)x^n+z{'}(x)
\]

其中,\(z^{'}(x)\)是\(z(x)\)的最低\(n\)位,\(z^{''}(x)\)是剩下的位数。

然后我们就像在GF(p)中那样,我们计算模数通过:

\[z(x) \equiv z^{''}(x)x^n+z^{'}(x) \equiv z^{''}(x)(x^t+1)+z^{'}(x) \\
\equiv z^{''}(x)x^t+z^{''}(x)+z^{'}(x) \mod f(x)
\]

这个运算因为\(t\)是一个更小的数使得它变得简单了。

[2]中也描述了标准规约的另一个优化。考虑到标准的例程会规约\(z(x)\) 的次数\(m\)而不是\(f(x)\)的次数\(n\):

\[z(x) = a_mx^m+a_{m-1}x^{m-1}+...+a_1x^1+a_0x^0 \\
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)$的方法。的更多相关文章

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

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

  2. NeHe OpenGL教程 第二十五课:变形

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

  3. javaSE第二十五天

    第二十五天    399 1:如何让Netbeans的东西Eclipse能访问.    399 2:GUI(了解)    399 (1)用户图形界面    399 (2)两个包:    399 (3) ...

  4. Gradle 1.12用户指南翻译——第二十五章. Scala 插件

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

  5. SQL注入之Sqli-labs系列第二十五关(过滤 OR & AND)和第二十五A关(过滤逻辑运算符注释符)

    开始挑战第二十五关(Trick with OR & AND) 第二十五关A(Trick with comments) 0x1先查看源码 (1)这里的or和and采用了i正则匹配,大小写都无法绕 ...

  6. “全栈2019”Java多线程第二十五章:生产者与消费者线程详解

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

  7. centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

    centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节 ...

  8. “全栈2019”Java第二十五章:流程控制语句中循环语句while

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

  9. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

随机推荐

  1. 学习java第十九天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  2. 日常Java 2021/10/19

    Java集合框架 Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射. Collection接口又有3种子类型,Li ...

  3. day05 django框架之路由层

    day05 django框架之路由层 今日内容概要 简易版django请求声明周期流程图(重要) 路由匹配 无名有名分组 反向解析 无名有名解析 路由分发 名称空间 伪静态 虚拟环境 简易版djang ...

  4. 数仓day02

    1. 什么是ETL,ETL都是怎么实现的? ETL中文全称为:抽取.转换.加载  extract   transform  load ETL是传数仓开发中的一个重要环节.它指的是,ETL负责将分布的. ...

  5. Nginx流量拷贝

    1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...

  6. 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 ...

  7. 【Linux】【Shell】【text】Vim

    文本编辑器: 文本:纯文本,ASCII text:Unicode: 文本编辑种类: 行编辑器:sed 全屏编辑器:nano, vi vi: Visual Interface vim: Vi IMpro ...

  8. apply 和 call 的区别

    相同点: 都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行 不同点: call方法从第二个参数开始可以接收任意个参数,每个参数会映射到相应位置的func的参 ...

  9. 13.Vue.js 组件

    组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽 ...

  10. MySQL5.7安装教程(亲测有效)

    跟着狂神学java到了数据库阶段了,首先得安装好数据库啊,这里用的是MySQL 压缩包下载:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5. ...