发明内容
针对上述现有技术中存在的缺陷,本发明所要解决的技术问题是提供一种使用方便、性能优良、易于进行SoC集成的、低成本、高性能,小面积的集成电路中素数域椭圆曲线密码算法的实现方法。
为了解决上述技术问题,本发明所提供的一种集成电路中素数域椭圆曲线密码算法的实现方法,其特征在于,方法流程如下:
1)将两维仿射点(x,y)坐标映射到三维Jacobin投影坐标(X,Y,Z),映射过程如下(x,y)→(x,y,1)=(X,Y,Z);
2)将投影坐标点转换成Montgomery(以发明者的名字命名的算法)表示,转换过程如下(X,Y,Z)→(XR,YR,ZR)对这种形式下(投影坐标,Montgomery表示)的点坐标施加包括点乘,倍点和点加的点运算操作,得到的点运算初步结果(XR,YR,ZR);
3)将投影坐标结果(XR,YR,ZR),映射回仿射坐标(xR,yR);
4)将Montgomery表示的(xR,yR)恢复为普通表示(x,y);
在所述步骤1-4中,运算中用到的所有大数,包括椭圆曲线参数,运算的点坐标,密钥等全部都存储到以SRAM为介质的Memory中。
进一步的,所述Montgomery表示下的运算包括Montgomery模乘算法和Montgomery模平方算法。
进一步的,在所述步骤2中,点乘kQ运算中,k采用NAF编码。
进一步的,所述点乘运算实现过程中调用的倍点和点加的数据交互方法,即使用如下点乘算法,点乘过程中采用NAF编码不断调用倍点和点加算法。采用表1所述的点加和倍点数据交互方法:
1)NAF编码h=3k;
2)读取第i个NAF编码;
3)计算S=2S,此时Q不可读写;
4)如果(hi=1&&k=0)或(hi=0&&k=1);则转至5);则转至2);
5)计算Q=S±Q,此时S可读不可写,则转至2)。
这可以使整个点乘和单个点加或者倍点运算过程中数据交互开销降到最低,减少运算的时间。
进一步的,运算所述Montgomery模乘算法的Montgomery模乘器包括用于完成XY操作的第一级32bit乘法器、用于完成T+XY+c运算的第二级加法器和加法器前的42压缩器组成的流水线硬件通路。
进一步的,所述相关操作数分别存放到不同的SRAM中。
进一步的,所述椭圆曲线密码运算使用的SRAM中仅有一个为双口SRAM的存储单元。
进一步的,所述Memory(SRAM)的时钟(工作)频率采用与运算模块(单元)频率相同、相位相差180度的反相时钟频率驱动。
利用本发明提供的集成电路中素数域椭圆曲线密码算法的实现方法,由于集成电路的运算中把大数全部放到SRAM中,既减小面积开销,又可进行大素数域上椭圆曲线的运算;由于采用NAF对k进行编码随后再进行扫描,这样平均可以节省1/6次点加运算;对NIST推荐的椭圆曲线,由于采用优化的Montgomery模乘方法,每次模乘可减少约10%运算开销;由于采用双口SRAM,读写操作就可以在一个时钟周期内同时完成,不需要等待,使硬件利用率达到100%;由于所述Memory(SRAM)采用运算模块(单元)的反相时钟频率驱动,使得存取数据速度提高100%;由于解决了操作数相关性的原理,使得SRAM的使用效率大大提高,既不影响性能,又降低了芯片的面积,可以为ECC的应用提供低成本高性能的解决方案。
本发明提供的集成电路中素数域椭圆曲线密码算法的实现方法,其特点如下:
·支持不超过544bit的任意素数域椭圆曲线的点加、点减、倍点和点乘运算;
·兼容IEEE1363国际标准;
·在100MHz频率下,256bit ECC点乘速度可达120次/秒;
·无穷远点和模数偶错误检测功能;
·坐标点是否在椭圆曲线上判断功能;
·可以进行不超过2048bit的RSA运算,每秒可完成1024bitRSA签名34次以上;
·ECC和RSA密钥保护功能;
·可以进行模乘、模平方、模加、模减和模逆等有限域运算;
具体实施方式
以下结合附图说明对本发明的实施例作进一步详细描述,但本实施例并不用于限制本发明,凡是采用本发明的相似结构、方法及其相似变化,均应列入本发明的保护范围。
本发明ECC实现是基于素数有限域公共密钥算法的各种应用而设计的ECC专用协处理器(IP核),可以最高支持544bit任意椭圆曲线的点加、点减、倍点和点乘运算,椭圆曲线方程:
y2=x3+ax+b (4a3+27b2≠0)a,b∈GF(p)
除了支持椭圆曲线的点运算,IP还支持不超过2048bit的RSA、模乘、模加减、模逆等有限域运算。
本发明能够获得优良性能特征的原因在于采用改进的适合硬件实现的算法
本发明的集成电路中素数域椭圆曲线密码算法的实现方法,算法流程如下:
1)将两维仿射点(x,y)坐标映射到三维Jacobin投影坐标(X,Y,Z),映射过程如下(x,y)→(x,y,1)=(X,Y,Z);
2)将投影坐标点转换成Montgomery表示,转换过程如下(X,Y,Z)→(XR,YR,ZR)对这种形式下(投影坐标,Montgomery表示)的点坐标施加点运算操作,得到的点运算初步结果(XR,YR,ZR);
3)将投影坐标结果(XR,YR,ZR),映射回仿射坐标(xR,yR);
4)将Montgomery表示的(xR,yR)恢复为普通表示(x,y);
在所述步骤1-4中,运算中用到的所有大数,包括椭圆曲线参数,运算的点坐标,密钥等全部都存储到以SRAM为介质的Memory中。
在步骤2中,点乘kQ运算中,k采用NAF编码;
采用新型的点乘点加和倍点调度策略;
点乘就是点的标量乘法运算,一个整数k乘以坐标点P,得到另一个坐标点Q。实际点乘分解成点加减和倍点的不断调用来实现的,这个过程中要把k扫描一遍,可以采用二进制编码。本发明中采用NAF对k进行编码随后再进行扫描,这样平均可以节省1/6次点加运算。整个过程如下:
点乘kQ运算是最为核心的运算,k采用NAF编码流程如下所示:
算法ECC点乘(ECPM)
Input:int eger:k,point:Q
Output:point:kQ
计算3k的二进制表示hihi-1…h1h0,同时根据k的二进制表示kiki-1…k1k0
S=Q;
for(i=l-1;i>0;i--){
S=2S;
if(hi==1&ki==0)S=S+Q;
if(hi==0&ki==1)S=S-Q;}
return(S);
点乘过程需要存储S(X0,Y0,Z0)、Q(X1,Y1,Z1)点坐标、椭圆曲线参数(a,b,N)和一些中间值,这都是很大的数。如使用寄存器组存储,虽然使用方便,但其的面积是不可忍受的。为了把IP的面积控制在较小的范围,又可进行大素数域上椭圆曲线的运算,IP把大数全部放到SRAM中,减小面积开销。但使用SRAM代价是在一个周期只能读取或者写入一个字。这就需要一种新的点运算的调配策略,将数据交互的开销降到最低,根据上述算法,如图1所示,点乘过程:
1)NAF编码h=3k;
2)读取第i个NAF编码;
3)计算S=2S,此时Q不可读写;
4)如果(hi=1&& k=0)或(hi=0&& k=1);则转至5);则转至2);
5)计算Q=S±Q,此时S可读不可写,则转至2)。
因为如果在更新Q的过程中使用了S的存储空间,那么就不能再下一步计算中就无法得到正确的S值,反之亦然。要克服这些限制又要减少读写Memory的开销,还要提高Memory的使用率,就要专门设计一个适合点乘运算的Memory管理方案。
为了实现点乘,运算过程中需要存储数据交互数据,本发明提出了一种新的点乘倍点和点加调度策略,减少了数据交互的次数,提高了效率。其具体如下:
基于这种原则,设Q(X1,Y1,Z1),S(X0,Y0,Z0),那么倍点和点加的调配策略分别是:
表1 倍点和点加的策略
倍点步骤 | 结果存入 | 点加步骤 | 结果存入 |
A | T1 | Z02 | Buffer |
Z02 | T2 | U0=X1*Z02(X1*Buffer) | X1 |
Z04 | T2 | Z03(Z0*Buffer) | Buffer |
a*Z04 | T2 | S0=Y1*Z02(Y0*Buffer) | Y1 |
X02 | T1 | Z12 | Buffer |
3*X02 | T1 | U1=X0*Z12(X0*Buffer) | T1 |
M=T1+T2 | T1 | Z13(Buffer*Z1) | Buffer |
Y0*Z0 | Z0 | S1=Y0*Z12(Y0*Buffer) | T2 |
Z0=2*Y0*Z0 | Z0 | W=U0-U1=X1-T1 | T1 |
Y02 | Y0 | R=S0-S1=Y1-T2 | T2 |
X0*Y02 | T2 | T=U0+U1=2*X1-T1 | X1 |
S=4*X0*Y02 | T2 | M=S0+S1=2*Y1-T2 | Y1 |
M2 | X0 | Z1Z0 | Z1 |
X0=M2-2S | X0 | Z1=Z1*T1 | Z1 |
Y04 | Y0 | W2=T1*T1 | Buffer |
T=8*Y04 | Y0 | W3=T1*Buffer | T1 |
S-X0 | T2 | TW2=X1*Buffer | Buffer |
M*(S-X0) | T2 | R2=T2*T2 | X1 |
Y=M*(S-X0)-T | Y0 | X1=X1-Buffer | X1 |
| | V=Buffer-2*X1 | Buffer |
| | VR=T2*Buffer | T2 |
| | MW3=Y1*T1 | T1 |
| | T2-T1 | Y1 |
| | Y1=Y1/2 | Y1 |
倍点需要T1、T2两个额外存储器,点加需要T1、T2和Buffer三个存储器。每次倍点后结果存入S,点加减后结果存入Q,无需另行数据交换。
采用优化的Montgomery模乘算法和模平方算法;
Montgomery模乘的基本形式如下(这里的N相当于前面的有限域特征值p):
选择参数N′,R-1,满足0<R-1<N,0<N′<R,使得R*R-1-N*N′=1。
Mont(A,B)=ABR-1mod N
Step1:T AB
Step2:T=[T+(TN′mod R)N]/R其中R=2r,r=n+2,n是N的bit数;
本发明中采用的优化的CIOS Montgomery算法:
优化的Montgomery模乘算法CIOS
Input:A,B,N Output:ABR-1mod N
原始的CIOS算法for(i=0;i<k;i++){c=0;for(j=0;j<k;j++){(c,T[j])=T[j]+A[j]*B[i]+c;}(T[k+1],T[k])=T[k]+c;c=0;m=T[0]*N[0]’mod W;(c,s)=T[0]+m*N[0];for(j=1;j<k;j++){(c,T[j-1])=T[j]+m*N[j]+c;}(c,T[k-1])=T[k]+c;T[k]=T[k+1]+c;} | 优化的CIOS算法for(i=0;i<Rk;i++){c=0;it(i<Bk){for(j=0;j<Ak;j++){(c,T[j])=T[j]+A[j]*B[i]+c;}(t,T[j])=T[j]+c;}c=0;m=T[0]*N[0]’mod W;(c,s)=T[0]+m*N[0];for(j=1;j<Nk;j++){(c,T[j-1])=T[j]+m*N[j]+c;}(c,T[j-1])=T[j]+c;if(i<Bk)T[j]=t+c;elseT[j]=c;} |
表 优化的Montgomery模乘算法
CIOS算法内外循环都是k次,k表示R的字数。而实际A、B和N的字数(Ak,Bk,Nk)都可能比k小,这就会有冗余计算,经研究发现可以让循环只做必需的次数,就可消除这种冗余计算。改进在A、B、N的字数小于R的字数时非常明显。对NIST推荐的椭圆曲线,应用优化的方法每次模乘可减少约10%运算开销。
改进的CIOS Montgomery模平方算法
模平方运算就是输入的两个乘数相等的情况,是一种特殊的模乘。下面是具体的算法:
表 优化的Montgomery模平方算法
改进是将AB相乘的循环改称如下形式:
for(j=i;j<Ak;j++)
{ if(i==j)
(c,T[j])=T[j]+A[j]*A[i]+c;
else
(c,T[j])=T[j]+2*A[j]*A[i]+c;}
根据两个操作数相等的特点将运算开销再减少25%左右。
流水线设计的Montgomery模乘器;
本发明的特征还在于依据改进的算法量身定做的Montgomery模乘器采用2级流水线设计,硬件利用率100%。IP的关键路径得到优化,工作频率得以提高。
本发明采用的Montgomery算法最需要有效实现(c,T)=T+XY+c,(c,T)=T+2XX+c两种运算,为此设计的Montgomery模乘器的数据通路结构如图4所示:
模乘器采用了两级流水线,第一级32bit乘法器完成XY操作,第二级加法器完成T+XY+c运算(乘积的高32位应计入T的下一字,所以要延迟一个周期送入加法器),加法器前加入42压缩器把四个数转换成两个数相加,优化了面积和关键路径。
IP的运行频率主要取决于所采用的工艺和内部关键路径的延迟,基于SMIC0.18um工艺,经DC综合该运算单元可以运行在120MHz。
改进的模乘器硬件电路和SRAM的特性还在于,设计中采用了双口SRAM,由于T要在同一周期内进行读和写两种操作,设计中采用双口SRAM,读写操作就可以在一个时钟周期内同时完成,不需要等待。硬件利用率达到100%。应用NIST256bit椭圆曲线参数进行模乘和模平方分别仅需要183和145周期。
本发明能够具有较小面积的特征的原因在于成功解决了存储相关性问题,采用SRAM作大数存储模块大大减小了芯片面积。
根据操作数相关性设计其在SRAM中的位置策略;
本发明的特征还在于使用SRAM的方法,为了保证运算的性能,放置了4块单口SRAM和一块双口SRAM。
由于ECC点运算中涉及的操作数(坐标点,临时量,曲线参数,有限域特征)很多,而有时候需要把同时存取不同的操作数,这里把这种情况下的操作数叫做相关操作数,如果相关的操作数放置到一块SRAM中的话就会产生问题,因为SRAM只有一个读写口,要取出两个字的数据必须等待,那就影响到IP的速度。这就要求有相关性的不能放到相同的SRAM中,没有相关性的可以放到一块SRAM中,这就给操作数的放置提出了难题,以下称之为操作数相关性原则。
本发明经过研究放置4块SRAM采用新型的点乘调配策略可以在不违反操作数相关性原则的基础上完成SRAM的放置策略。放置的策略如下所示(参见第2节):
对于倍点运算:
SRAM1 | SRAM2 | SRAM3 | SRAM4 |
| b | | |
Z0 | T0 | a | |
X0 | Y0 | N | T2 |
对于点加运算:
SRAM1 | SRAM2 | SRAM3 | SRAM4 |
X1 | b | Z1 | Buffer |
Z0 | T1 | a | Y1 |
X0 | Y0 | N | T2 |
与此同时RSA运算也可以以用这种Memory的分配方式进行下面其具体分配方式:
其中的A,E,N,R意义可以从RSA的扫描算法中看出。
Input:A,E,N,X=R2 mod N,E=eq,eq-1,eq-2,…,e0,eq=1
Output:AEmod N
A=Mont(A,X);
R=A;
for j=q-1 to 0{
A=MontSqu(A);
if(ej==1)
A=MontMul(A,R);
}
A=Mont(A,1);
这样设计的Memory放置策略可以同时适应两种算法,克服了使用SRAM造成的不便,使得IP的运算速度大幅提高。
本发明采用SRAM面积大大减小面积
一般的数字电路设计中,往往把信息存储到寄存器中,这样做可以使得设计简单,存储方便。但是对于当前主流的CMOS工艺要实现1bit的寄存器一般需要几十个MOS管的开销。而大素数域的ECC运算需要存储和处理的数据长度非常大,如果使用寄存器进行存储,那么最终实现的面积将是不可忍受的。IC的成本很大程度上取决于单个芯片的面积,如果ECC采用寄存器进行大数存储,虽然简化了设计的工作,但成本将是很大的问题。
本发明中运算中用到的所有大数,包括椭圆曲线参数,运算的点坐标,密钥等全部都存储到以SRAM为介质的Memory中,极大地减少IP的面积,这是因为:
目前一般通过D-Flip-Flop实现寄存器。实现一个DFF需要30个管子左右;而一般的SRAM单元只需要6个管子,在相同工艺下自然前者比后者的占用面积大,而且各工艺厂商专门对于SRAM进行了优化,使得SRAM变得密度更高,面积更小。
为了能够把ECC IP的面积限定在一个较小的范围内,又希望ECC IP能够支持很大素数的运算功能。本发明采用了SRAM进行大数存储,极大的减小了面积开销。在现今的CMOS工艺中,SRAM可以达到非常高的存储密度。典型的1bit SRAM单元如图2所示;版图的对比如图3所示,其中图3A为现有技术中典型1bit触发器单元版图,图3B为本发明实施例SRAM标准1bit触发器单元版图。
本发明为了保证运算单元读写SRAM的速度,采用了SRAM和运算单元采用反相时钟设计的技术。
Memory(SRAM)和运算模块之间采用相同频率,相位相差180度的反相时钟驱动,使得存取数据速度提高100%;
这个可以从如下的波形图中看出来,在运算模块时钟的第一个上升沿给出读信号,等待半个时钟周期Memory模块的上升沿,SRAM采到地址和读写信号后会把数据放到总线上,等到运算模块时钟的第二个上升沿的时候就可以拿到数据了。
应用本发明的技术的读写波形图如图5、图6所示:现有技术的读写波形图如图7、图8所示。
如图7、图8所示,如果Memory和运算单元都采用统一的时钟,由于Setup Time的原因运算模块要去一个数据,第一个时钟周期给出读写信号后要等待2个周期才能得到有效数据。
波形图说明:
从图5、图6所示的波形图中可以清楚看出采用反相时钟可以把Memory的读写的速度提高100%,这样就可以克服使用SRAM带来的速度影响。