w-NAF不相邻表示形式
老板说,你去学一下w-NAF,哎,立马去学~,狗腿子得自觉。
从搜索w-NAF,到NAF,到倍点运算,到ECC,再到Diffie-Hellman算法,真是人生无常,大肠包小肠。。。
ok,开始啦!!!!介绍w-NAF之前,先介绍一些预备知识吧(别看写的不多,其实too much,看了很多杂七杂八的)~~~
1、椭圆曲线的倍点运算np double-and-add(暂且基于素曲线GFp讨论:三次方程中的变量和系数都来自{0,1,2,……,p-1})
下面考虑由所有满足椭圆曲线方程的整数对和无穷远点O组成的集合Ep(a,b),系数a,b,变量x,y都是GFp的元素。
Ep(a,b)上的加法运算构造与定义在实数上的椭圆曲线中描述代数方式是一致的。对任何点P,Q∈Ep(a,b)
- P + O = P
- 若P= ( xp , yp),则P + ( xp , -yp) = O 。点 ( xp , -yp)是p的负元,记为-p。例如E23(1,1)上的点p(13,7),负元-p=(13,-7),-7 mod 23 =16,因此-p=(13,16),也在E23(1,1)上。
- 若P = ( xp , yp),Q = ( xq , yq),P ≠ Q,则R = P + Q =(xr ,yr)可由下列规则确定
xr =(m²-xp-xq)mod p |
yr = (m(xp - xr)- yp)mod p |
其中 P≠Q时,m=(yq - yp)/(xq - xp) mod p |
P=Q时, m= (3xp²+a)/2yp mod p |
- 乘法的定义为重读相加。比如4p = p + p + p + p = 2p + 2p
这里主要介绍一下倍点运算算法1,2
算法1 nP倍点运算
1 Input:A positive integer n=(n[l-1] n[l] …… n[0])2,Point P 2 Output:R = nP 3 R = 0*P 4 for i = l - 1 to 0 do 5 R = 2R 6 if n[i] = 1 do 7 R = R + P 8 return R
算法2 同款np倍点运算,性能比1差,但抵抗侧信道攻击能力更强一些
1 Input:A positive integer n=(n[l-1] n[l] …… n[0])2,Point P 2 Output: R = nP 3 R = 0P 4 for i = l - 1 down to 0 do 5 R = 2R 6 R = R +n[i]R 7 return R
2、窗口方法 Windowing method :
上述倍点运算每次只扫描标量n的一个比特,窗口方法一次扫描w个比特,使点P一次完成(ni+w,……,ni+1)* P,此时点加法操作由原来的l减少到l/w。
窗口方法分为两种:固定w位窗口(fixed window)和移动w窗口(sliding window)。
算法3 固定窗口 这里必须预先计算查找表中的值2P、3P、...,(2ω−1)P。
1 Input:A positive integer n=(n[l-1] n[l] …… n[0])2,Point P 2 Output:R = nP 3 将 n 转化位 2^w 方式:n=(c[j-1],……,c[0])2^w 4 R = 0P 5 for k = j - 1 down to 0 do 6 R = 2^w R 7 R = R + c[k]*P 8 return R
算法4 滑动窗口 这里必须存储奇数倍的p,3p,5p,……,{2(2ω−(-1)w)/3 - 1}P
1 Input:A positive integer n=(n[l-1] n[l] …… n[0])2,Point P 2 Output:R = nP 3 R = P 4 i = l - 1 5 while i ≥ 0 do 6 if n[i] = 0 then 7 R = 2R 8 i = i - 1 9 else 10 s = max(i - w + 1, 0) 11 while n[s] = 0 do 12 s = s + 1 13 for h =1 to i - s + 1 do 14 R = 2R 15 u = (n[i] n[i-1] …… n[s])2 16 R = R + uP 17 i = s - 1 18 return R
3、Non-adjacent form(NAF不相邻表示形式)
NAF是一种二进制符号的表示形式,定义为n=Σli=0 di2i,其中di∈{-1,0,1},并且不能有连续相邻的非零元素1或-1出现。因此用NAF表示数的密度约等于1/3,性能较无符号二进制表示形式要更好。将一个普通的二进制转化为他的NAF表示形式可以使用算法5、6,如图所示。
- 一个整数k有唯一的NAF表达形式
- 任何有符号数字表示k中NAF(K)具有最少的非零数字
- NAF(K)的长度最多比二进制K多一个比特
- 如果NAF(K)的长度是L,那么2L/3 < k < 2L+1 /3
- 在所有长度为l的NAFs中,非零位数的平均密度约为1/3。
算法5 将正整数n转化为2-NAF形式
1 Input:A positive integer n=(n[l+1] n[l] …… n[0])2,n[l+1]=n[l]=0 2 Output:NAF (n'[l] n'[l-1] …… n'[0]) 3 4 c[0]=0 5 for i=0 to l do 6 c[i+1]=(c[i]+n[i]+n[i+1])/2 //向下取整 7 n'[i]=c[i]+n[i]-2c[i+1] 8 return NAF (n'[l] n'[l-1] …… n'[0])
算法6 将整数n转为2-NAF形式
1 Input :An integer N = (n[l+1] n[l] ··· n[1] n[0])2 2 Output NAF n'=(n'[l] n'[l-1] n'[0]) 3 i ← 0 4 while N > 0 do 5 if n is odd then 6 n'[i] ← 2 − (n mod 4) 7 N ← N − n'[i] 8 else 9 n'[i] ← 0 10 N ← N/2 11 i ← i + 1 12 return NAF n'
4、应用于KP点的NAF运算
Input :A positive integer NAF(N) = (n[l] n[l] ··· n[1] n[0])2,Point P Output:Q = NP Q = 0 for i = l down to 0 do Q = 2Q if n[i] = 1 do Q = Q + P if n[i] = -1 do Q = Q - P return Q
5、A width-w NAF 结合了NAF和窗口w的特征
wNAF可以说是一种w进制表示形式,定义正整数k = Σl-1i=0 ki2i,其中,每个非零系数ki都是奇数且 |ki| < 2ω−1,kl-1≠0,任意连续的w个比特中最多只能有一个比特非零比特,w-NAF表示数的密度约等于1/(w+1)。NAF就是窗口为2的情况。
- 一个整数k有唯一的w-NAF表达形式
- NAF2(k)=NAF(k)
- NAFw(K)的长度最多比二进制K多一个比特
- 在所有长度为l,宽度为w的NAFw(K)中,非零位数的平均密度约为1/(w+1)。
算法7 将正整数k转化为wNAF形式
1 Input :A positive integer N = (n[l] n[l] ··· n[1] n[0])2 2 Output:w-NAF(N) 3 i=0 4 while N ≥ 1 do 5 if N is odd then 6 n'[i] = N mod 2w // N mod 2w 的结果区间在[-2(w-1),2(w-1)-1] 7 N = N - n'[i] 8 else 9 n'[i] = 0 10 N = N/2 11 i = i + 1 12 return n'[i-1] n'[i-2] …… n'[0]
粘图看个例子
6、应用于KP点的w-NAF运算
5已经把wNAF的系数k展示式算出来了,那么怎么应用捏,其实蛮简单的。
算法8 这里必须存储奇数倍的p,3p,5p,……,(2ω-1−1)P
1 Input :A positive integer w-NAF(N) = (n[l] n[l] ··· n[1] n[0])2,Point P 2 Output:Q = NP 3 Q = 0 4 for i = l down to 0 do 5 Q = 2Q 6 if n[i] ≠ 0 7 if n[i] > 0 do 8 Q = Q + n[i]P 9 else 10 Q = Q - n[i]P 11 12 return Q
7、curve25519中的scalar NAF稍作了解,闪退~~~~