第二十六个知识点:描述NAF标量乘法算法
第二十六个知识点:描述NAF标量乘法算法
NAF标量乘法算法是标量乘法算法的一种增强,该算法使用了非邻接形式(Non-Adjacent Form)表达,减少了算法的期望运行时间。下面是具体细节:
让\(k\)是一个正整数,\(P\)是一个在域\(F_q\)上椭圆曲线\(E\)上的点。这个计算乘法操作\(Q = k * P\)就是圆曲线上的标量乘法操作(点乘)。一个最简单计算的方法就是基于双倍-加法的霍纳规则的变体。顾名思义,该方法最突出的两个构建块是点加倍和点添加原语。就像名字那样,算法也十分简单。把\(k\)写成
\]
,其中\(k \in \{0,1\},i = 0,1,2,...,n-1\)。下面有两种算法来表达。
INPUT: k = (kt−1,..., k1, k0)2, P ∈ E(Fq).
OUTPUT: k ⋅ P.
Q←∞.
For i from 0 to t−1 do
If ki = 1 then Q←Q+P.
P←2P.
Return(Q).
INPUT: k = (kt−1,..., k1, k0)2, P ∈ E(Fq).
OUTPUT: k ⋅ P.
Q←∞.
For i from t−1 down to 0 do
Q←2Q.
If ki = 1 then Q←Q+P.
Return(Q).
第一个算法计算\(k\)从右到左,第二个算法计算从左到右。在一个二进制表示中,1的数量大概是t/2=m/2。因此期望的运行时间是
\]
。
在1951年,Booth[3]提出了一个新的标量二进制表达被叫做有符号二进制方法。然后Rietweisner[4]证明了每个整数在这种表达下都是独一无二的[5]。尤其,如果\(p=(x,y) \in E(F_q)\),那么有\(-P=(x,x+y)\),如果\(F_q\)是二进制域。同时如果\(F_q\) 的阶大于3,就有\(-P = (x,-y)\)。计算减法就会很有效。这让我们想出了另一种有符号整数的表达方式。\(k = \sum^{l-1}_{i=0}k_i * 2^i\),其中\(k_i \in \{0,+,-\}\)。一个十分有用的有符号整数表达就是不相邻范式(NAF)。NAF的形式就是上面那样,但是规定了 \(k_{l-1} \neq 0\),同时没有两个相邻的\(k_i\)都是0。NAF的长度是\(l\)。
NAF的性质[1]
- 每个正整数k都有独一无二的NAF表达。记作NAF(k)。
- NAF(k)有所有\(k\)的有符号表达最少的非零数字。
- NAF(k)的长度最多比二进制表达多一个。
- 如果NAF(k)的长度是l,那么有\(\frac{2^l}{3}<k<\frac{2^{l+1}}{3}\)。
- 在所有长度为\(l\)的NAF中,非零系数的概率约为1/3。
NAF(k)能够通过下面的算法有效率的计算。
INPUT: A positive integer k.
OUTPUT: NAF(k).
i←0.
While k≥1 do
If k is odd then: ki ←2−(k mod 4), k←k−ki;
Else: ki ←0.
k←k/2, i←i+1.
Return(ki−1, ki−2,..., k1, k0).
最后一个算法给出了我们可以用NAF(k)代替k[1]的二进制表示来修改标量乘法从左到右的二进制方法:
INPUT: Positive integer k, P ∈ E(Fq).
OUTPUT: k ⋅ P.
Based on previous algorithm compute NAF(k) =∑l−1i=0ki⋅2i.
Q←∞.
For i from l−1 down to 0 do
Q←2Q.
If ki = 1 then Q←Q+P.
If ki = −1 thenQ←Q−P.
Return(Q).
基于NAF的第三个和第四个属性,我们能计算上述算法的平均时间复杂度。
\]
[1] Hankerson, Darrel, Scott Vanstone, and Alfred J. Menezes. "Guide to elliptic curve cryptography". Springer Science & Business Media, 2004.
[2] Jonathan Taverne, Armando Faz-Hernández, Diego F. Aranha, Francisco Rodríguez-Henríquez, Darrel Hankerson, Julio López. "Speeding scalar multiplication over binary elliptic curves using the new carry-less multiplication instruction", Journal of Cryptographic Engineering, Vol. 1, No 3, pp. 187-199, 2011.
[3] A.D.Booth, “A Signed binary multiplication technique”, Journal of Applied Mathematics, Vol. 4. No. 2, pp.236-240, 1951
[4] G.W.Reitwiesner, “Binary Arithmetic”, Advances in computers, Academic Press, Vol. 1, pp.231-308, 1960
[5] Karthikeyan, E. “Survey of elliptic curve scalar multiplication algorithms.” International Journal of Advanced Networking and Applications, Vol. 4, No 2, pp. 1581-1590, 2012
第二十六个知识点:描述NAF标量乘法算法的更多相关文章
- 第三十六个知识点:Index Calculus算法
第三十六个知识点:Index Calculus算法 我们这篇博客继续描述一种数学攻击,这种数学攻击被叫做Index Calculus(IC)算法. 注意这里Index Calculus算法没有找到合适 ...
- 第十六个知识点:描述DSA,Schnorr,RSA-FDH的密钥生成,签名和验证
第十六个知识点:描述DSA,Schnorr,RSA-FDH的密钥生成,签名和验证 这是密码学52件事系列中第16篇,这周我们描述关于DSA,Schnorr和RSA-FDH的密钥生成,签名和验证. 1. ...
- 第二十四个知识点:描述一个二进制m组的滑动窗口指数算法
第二十四个知识点:描述一个二进制m组的滑动窗口指数算法 简单回顾一下我们知道的. 大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法.因此,现代密码学需要大指数模幂算法的有效实现.我 ...
- NeHe OpenGL教程 第二十六课:反射
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Gradle 1.12用户指南翻译——第二十六章. War 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 大白话5分钟带你走进人工智能-第二十六节决策树系列之Cart回归树及其参数(5)
第二十六节决策树系列之Cart回归树及其参数(5) 上一节我们讲了不同的决策树对应的计算纯度的计算方法, ...
- 第二十五个知识点:使用特殊的素数定义$GF(p)$和$GF(2^n)$的方法。
第二十五个知识点:使用特殊的素数定义\(GF(p)\)和\(GF(2^n)\)的方法. 在我们之前看到的博客中,当实现密码学方案时,一个最频繁调用的操作就是模运算.不幸的是,尽管模块化的使用非常广泛, ...
- 第二十八个知识点:什么是公钥密码学的IND-CCA安全定义?
第二十八个知识点:什么是公钥密码学的IND-CCA安全定义? 我们将在这篇博客中讨论公钥加密的IND-CCA安全. IND-CCA安全代表选择明文的不可伪造性.这样的安全方案的思想就是给定一个密文,攻 ...
- SQL注入之Sqli-labs系列第二十六关(过滤空格、注释符、逻辑运算符注入)和第二十六A
开始挑战第二十六关(Trick with comments and space) 0x1看看源代码 (1)过滤了# or and /**/ / \ ,通过判断也过滤了空格 (2)这样一来只能看 ...
随机推荐
- 学习java的第十六天
一.今日收获 1.完成了手册第二章没有验证完成的例题 2.预习了第三章的算法以及for语句与if语句的用法 二.今日难题 1.验证上出现问题,没有那么仔细. 2.第二章还有没有完全理解的问题 三.明日 ...
- C语言内自定义汇编函数&调用约定
探究如何在C语言里直接自写汇编函数 裸函数 裸函数与普通函数的区别 普通函数在经过编译器编译时,编译器自动生成保护现场,恢复现场等反汇编代码 当我们想要自己实现函数内部的汇编代码时,就可以告诉汇编器不 ...
- 容器之分类与各种测试(三)——stack
stack是栈,其实现也是使用了双端队列(只要不用双端队列的一端,仅用单端数据进出即完成单端队列的功能),由于queue和stack的实现均是使用deque,没有自己的数据结构和算法,所以这俩也被称为 ...
- 节省内存的循环banner(一)
循环banner是指scrollview首尾相连,循环播放的效果,使用非常广泛.例如淘宝的广告栏等. 如果是简单的做法可以把所有要显示的图片全部放进一个数组里,创建相同个数的图片视图来显示图片.这样的 ...
- 格式化代码(Eclipse 格式化代码块快捷键:Ctrl+Shift+F)
1.格式化java代码 : ①Ctrl+Shift+F 但是我们会遇到按 Ctrl+Shift+F不起作用的时候? Ctrl+Shift+F 在搜狗拼音里是简繁替换.一旦安装搜狗拼音这个快 ...
- Output of C++ Program | Set 12
Predict the output of following C++ programs. Question 1 1 #include <iostream> 2 using namespa ...
- 【Linux】【Services】【Docker】基础理论
1. 名称空间:NameSpace 内核级别,环境隔离: 1.1. 名称空间的历史 PID NameSpace:Linux 2.6.24 ,PID隔离 Network NameSpace:Linux ...
- Spring Boot 和 Spring Cloud Feign调用服务及传递参数踩坑记录
背景 :在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnectio ...
- js - 日期、时间 Date对象方法
Date 是 JS 内置的日期构造函数 var d = new Date(); // 这个是系统当前时间的日期实例 d.getYear(); // 返回 d 实例年份 - 1900 d.getFul ...
- C++STL标准库学习笔记(一)sort
前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...