其他分享
首页 > 其他分享> > w-NAF不相邻表示形式

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)

       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

 

这里主要介绍一下倍点运算算法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ω−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出现。因此用NAF表示数的密度约等于1/3,性能较无符号二进制表示形式要更好。将一个普通的二进制转化为他的NAF表示形式可以使用算法5、6,如图所示。

算法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 :A positive 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、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的情况。

算法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 2^w // N mod 2^w 的结果区间在[-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]

粘图看个例子

 

 5、应用于KP点的w-NAF运算

3和4已经把wNAF的系数k展示式算出来了,那么怎么应用捏,其实蛮简单的。

 算法8 
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

6、curve25519中的scalar NAF稍作了解,闪退~~~~

 

 

标签:do,return,形式,相邻,integer,NAF,Input,mod
来源: https://www.cnblogs.com/0211ji/p/16028021.html