第二十五个知识点:使用特殊的素数定义\(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. IDEA修改数据库信息,结果修改信息中文成 ?

    今天在用IDEA进行插入数据库信息时,发生了一件意想不到的事情,特意记录一下,方便后续查看: 就是我在IDEA的驱动文件中配置了useUnicode = true & characterEnc ...

  2. abuse

    abuse 近/反义词: ill-treat, maltreat, mistreat, misuse, prostitute, spoil; defame, disparage, malign, re ...

  3. day04 sersync实时同步和ssh服务

    day04 sersync实时同步和ssh服务 sersync实时同步 1.什么是实时同步 实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器. 2.为什么使 ...

  4. 零基础学习java------25--------jdbc

    jdbc开发步骤图 以下要用到的products表 一. JDBC简介 补充    JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商趋势线这个接口,提 ...

  5. ubuntu18.10搜狗输入法的安装

    记录一下 1.卸载ibus ubuntu默认使用ibus管理输入法,官方推荐使用fcitx.我们先卸载ibus sudo apt-get remove ibus 清除ibus配置,如果没有设置 sud ...

  6. Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null objec

    遇到这个一场折腾了1个小时, 这是系统在解析XML的时候出错, 最后费了好大的劲才发现 XML文件中,<View>  写成小写的 <view> 了. 崩溃啊.......... ...

  7. shell脚本计算Linux网卡流量

    本文介绍了计算linux网卡流量的一个shell脚本,一个通过固定间隔时间获取ifconfig eth0 的字节值而计算出网卡流量的方法,有需要的朋友参考下. 使用shell脚本计算Linux网卡流量 ...

  8. 【Spring Framework】spring管理自己new的对象

    使用AutowireCapableBeanFactory手动注入 使用.newInstance();创建对象的话,如果其他对象都使用Spring Autowired,还需要手动创建所有依赖的Bean: ...

  9. 【C/C++】最长不下降子序列/动态规划

    #include <iostream> #include <vector> using namespace std; int main() { //输入 int tmp; ve ...

  10. 【C/C++】引用&的含义/语法/作为函数参数/函数返回值/本质/常量引用

    含义 引用不产生副本,只是给原变量起了别名. 对引用变量的操作就是对原变量的操作. 基本语法 数据类型 &别名 = 原名 e.g. int a = 10; int &b = a; // ...