背景技术
随着智能卡技术应用领域的不断扩展,人们对信息安全的要求不断提高。在众多的加/解密算法中,RSA算法是目前流行很广的一种公开密钥算法,运用该算法可以实现数字签名、数据加密等应用。
RSA加密算法的加密过程可以表述为:E=CemodN;解密过程为C=EdmodN,其中C、E、e、d、N为很大的二进制数,通常为512位、1024位或更长,其中C为要传送的明文,(e,N)为加密密钥,e是公开的,经过加密运算后生成密文E,(d,N)为解密密钥,d是保密的,通过解密运算得到传送的明文C,其公开密钥和私人密钥是一对大素数的函数。RSA的安全是基于大素数分解的难度,其正确性已被理论和实践所证明,并且已经制造出了许多采用RSA加密算法的芯片。
RSA加/解密算法的核心问题是大数模幂运算,它的运算量很大,而且实现起来也存在一定难度,但是我们知道模幂运算可以转化成多次的模乘运算来实现。因此可以通过设计高效的大数模乘协处理器来解决模幂运算问题,提高***性能。模幂运算的一种分解算法如下:
begin
C=C×RmodN
X=1×RmodN
for i=u-1 down to 0
X=MonPro(
X,
X)
if(ei=1)then
X=MonPro(
C,
X)
X=MonPro(
X,1)
return X
end
式中的C,e,N的含义如前所述,R是与N互素的一个基,通常R=2s,S表示N的位数,最后返回的X值即为密文E。Monpro(A,B)代表蒙格玛丽(Montgomery)算法函数。通过上述算法,将模幂运算转换成了多次大数模乘运算。因为Monpro(A,B)返回的是A×B×R′modN的值(R×R-1modN=1),为了消去其中的R′,在算法开始阶段将C变换为
C,X变换为
X后再进行运算,最后再从
X变换回X。
其中,原始的Montgomery模乘算法可以表述如下:
function REDC(T)
m=(Tmod R)N′mod R
t=(T+mN)/R
if t≥N then
return t-N
else return t
R-1和N满足0<R-1<N,0<N-1<R,RR-1-NN-1=1;T为给定的大整数T且0≤T≤RN,在上述模幂运算的分解算法中,T=
X×
X或者T=
C×
X。关于模幂运算和原始Montgomery算法可参考中国专利申请97110289.9。
为了实现原始的Montgomery算法,在IEEE Micro,June 1996中公开了一篇名为“ANALYZING AND COMPARING MONTGOMERYMULTIPLICATION ALGORITHMS”Page 26~33的文章,介绍了一种用于实现多精度Montgomery算法的CIOS算法,将Montgomery算法分解成了适于在硬件上实现的位操作模式,在文中可以看出,与其它的SOS、FIPS、FIOS及CIHS算法相比,CIOS算法所进行的乘法、加法和读写操作次数是最少的。由于本发明是对多精度CIOS算法的改进,因此,下面对其运算过程作较详细地说明,为了便于理解,其中的变量符号根据本发明作了调整。至于公式的推导,请参照上述公开文献的介绍。
该CIOS算法中的常数R(含义同前所述)、乘数x、被乘数y、模N都是s位r进制整数,即x=xs-1xs-2…x1x0,y=ys-1ys-2…y1y0,n=ns-1ns-2…n1n0;用来保存计算结果(和中间结果)的S有s+2位(中间储存的需要),即S=Ss+1Ss…S1S0,r=2k,K可以为8、16、32或更大;C1、T1、n’[0]及m均为一位r进制数,C1用于存储位运算结果的高位或进位,T1用于暂存位运算结果的低位或和,下面不再重复说明。n’[0]为常数且满足n’[0]=-n[0]-1mod2k,m为中间变量。通过该算法可以用位乘法、位加法、进位处理及相应的数据读取操作来完成大数模乘运算。与原始的Montgomery算法相似,该算法由在同一外循环中交替进行的S=x×y和S=(S+mn)/R两个内循环运算,以及最后根据S与N的比较结果,返回S值或S-N值的选择运算来实现。其运算流程及其说明如下,在运算开始前,将S的各位置为0:
for i=0 to s-1 ∥开始外循环
{
C1=0 ∥进位清零
for j=0 to s-1 ∥将y的第i位与x的第j位相乘后,与S的第j
(C1,T1)=S[j]+x[j]y[i]+C1 位和进位C1相加,结果赋给T1和C1,再将T1
S[j]=T1 的值赋给S的第j位,以j为循环变量
(C1,T1)=S[s]+C1 ∥将S的第s位与C1相加
S[s]=T1 ∥将相加的和赋给S的第s位
S[s+1]=C1 ∥将相加的进位赋给S的第s+1位,得到y[i]与x
相乘的结果,并存入S
C1=0
m=S[0]n′[0]mod2k ∥按公式计算m值
(C1,T1)=S[0]+mn[0] ∥将S[0]加上mn[0],结果赋给T1和C1
for j=1 to s-1 ∥将得到的S的第j位与mn[j]及进位C1相加,
(C1,T1)=S[j]+mn[j]+C1 结果赋给T1和C1,再将T1的值赋给S的j-1
S[j-1]=T1 位,以j为循环变量
(C1,T1)=S[s]+C1 ∥将上一循环结束时的C1值与S的第s位相加
S[s-1]=T1 ∥将相加的和赋给S的第s-1位
S[s]=S[s+1]+C1 ∥将相加的进位加S的第s+1位赋给S的第s位
} (因为(S+mn)/R是通过取(S+mn)的高s位计
算,因此第二次内循环中包含了一次移位运算)
C1=0 ∥开始返回结果的选择运算
for j=0 to s-1 ∥通过循环,运算S-N
(C1,y[j])=S[j]-n[j]-C1
(C1,y[s])=S[s]-C1
if C1=0 then return y[j] ∥如果运算无借位,即S>N,返回结果为S-N
else return S[j] 如果有借位,返回结果为S
在IC智能卡中一般通过协处理器来专门进行RSA加密运算过程中的大数模乘运算,以加速运算过程。其组成的***如图1所示。CPU 1将所要运算的数据装入***RAM 3,并控制模乘算法协处理器2完成一次模乘运算,***RAM 3用来存储初始的运算数据和运算结果。通过CPU核与协处理器的配合,进行多次模乘运算,最终完成RSA加/解密算法中的模幂运算。
用协处理器来实现上述算法时,要完成的基本运算为乘法、加法、及读/写操作,在硬件结构中,乘法和加法是分别通过乘法运算模块、加法运算模块来完成的,由于上述算法中并没有并行的加法或乘法运算,因此只需设置一个加法器和一个乘法器。而由于乘数x、被乘数y、模N及结果S等大整数存放在***RAM中,需要在逻辑控制模块的控制下,先将从地址寄存器中将所需操作数的地址放入RAM地址寄存器,而后从***RAM的相应地址中将数据读入到对应的操作数寄存器,或者将数据从协处理器写入到***RAM的相应地址中,完成一次读/写操作。用协处理器实现该算法时,由于加法、乘法、写地址,及读/写RAM操作可以通过不同的数据线来进行,因而在同一操作步中可以并行,但是同类操作在一个操作步中只能进行一次。
现有CIOS算法两个内循环的每次循环运算中,均包括了二次读操作和一次写操作,因此最少可以通过3个操作步来完成一次循环,二个内循环共需3(s-1)+3(s-2)=6s-9个操作步(加、乘运算与读/写操作并行,并且忽略最初不可并行的读操作)。由于协处理器需频繁访问***RAM,运算速度不理想。
发明内容
有鉴于此,本发明要解决的技术问题是提供一种加快RSA加/解密过程的方法,能够有效地提高RSA加/解密过程的速度。
为了达到上述目的,本发明提供了一种加快RSA加/解密过程的方法,包括以下步骤:
(A)在对要传送明文H进行加密时,根据E=HemodN进行模幂运算,得到密文E,完成加密,其中e、N为加密密钥;
(B)在对传送来的密文E进行解密时,根据H=EdmodN进行模幂运算,得到明文H,完成解密,其中d、N为解密密钥;
上述模幂运算是分解为多次的蒙格玛丽模乘算法来实现的,其特征在于,所述蒙格玛丽模乘算法通过以下方法实现:
设常数R、乘数x、被乘数y、模N都是s位r进制整数,x=xs-1xs-2…x1x0,y=ys-1ys-2…y1y0,n=ns-1ns-2…n1n0;S为s+1位r进制整数,S=SsSs-1…S1S0;r=2k;中间变量C1、T1均为一位r进制数,n’[0]为运算常数,i、j为循环变量,其特征在于,本算法还包括中间变量一位二进制数C和一位r进制数T2,在运算前先对变量S、T1、T2、C1及C赋零值,其运算步骤如下:
(a)令i为0,开始外循环;
(b)将S的第0位加上x第0位与y第i位的积,结果的低位赋给T1,高位赋给C1;
(c)将C1加上S第1位,和赋给T2,进位赋给C;
(d)将T1与n’[0]相乘后,求其对模2k的余数,结果赋给m;
(e)将T1加上m与n[0]的积,结果的低位赋给T1,高位赋给C1;
(f)令j=1,开始内循环;
(g)将T2与x的第j位与y的第i位的积以及进位C1相加,低位赋给T1,高位赋给C1;
(h)将S的第j+1位与C1及C相加,和赋给T2,进位赋给C;
(i)将T1加上m与n[j]的积,低位赋给T1,高位赋给C1;
(j)将T1的值赋给S的第j-1位,循环变量j加1,重复内循环直到j等于s,退出内循环;
(k)将T2加上C1,和赋给T1,进位赋给C1;
(m)将T1值赋给S的第s-1位;
(n)将C1加上C,和赋给S的第s位,循环变量i加1,重复外循环直到j等于s,退出外循环;
(o)给C重新赋零值;
(p)令j=0,开始循环;
(q)将S的第j位减去n的第j位和借位C,差赋给y的第j位,借位赋给C;循环变量j值加1,重复该循环直到j等于s时,退出循环;
(r)将S的第s位减去借位C,差赋给y的第s位,借位赋给C;
(s)如果借位C为零,返回y,否则返回S。,
由上可知,本发明在多精度Montgomery算法的基础之上,以多精度CIOS算法为基础并加以改进,减少了协处理器对***RAM的访问次数,提高了运算速度。
本发明要解决的另一技术问题是提供一种能够实现上述蒙格玛丽模乘算法的模乘运算电路。
为了达到上述目的,本发明提供了一种实现蒙格玛丽模乘算法的模乘运算电路,运算字长为K,包括:
数据寄存器,用于提供所述算法中加/减法运算和乘法运算的数据及保存运算的中间结果;
地址运算模块,用于提供对***RAM读写的地址,以将***RAM数据读入数据寄存器,或将数据寄存器的数据写入***RAM的相应位置;
乘法运算模块,用于从数据寄存器中选择进行运算的乘数和被乘数,执行乘法运算,并将运算结果保存到特定的数据寄存器中;
加/减法运算模块,用于从数据寄存器中选择进行运算的加数和被加数,执行加法运算,并将运算结果保存在相应的数据寄存器中;
逻辑控制模块,用于生成各种控制信号协调整个电路的工作,使其按设定的操作步顺序完成所述算法中的运算步骤,其中加/减法、乘法、读/写及写地址的操作可以在一个操作步中并行完成;
循环运算模块,用于对内外循环运算进行计数,并提供地址运算和循环控制所需的循环进程信息;
内部线路,完成协处理器内部部件间的数据传输,并通过接口与CPU、***RAM的总线相连;以及
启停控制模块,由CPU控制,用来启动和停止一次模乘运算的过程。
由上可知,本发明的模乘运算电路能够实现本发明算法,在多精度算法的运算过程中对***RAM的访问次数少,运算速度快外,此外,还对协处理器的结构设计进行了优化,设计了***配置寄存器,使本发明的协处理器支持从256bit到1024bit的数据运算长度,增加了应用的灵活性。
本发明要解决的又一技术问题是提供一种模幂运算电路,具有高的运算速度。
为了达到上述目的,本发明提供了一种包括上述模乘运算电路的模幂运算电路,CPU、***RAM分别与所述模乘运算电路相连;CPU首先将模乘运算电路置于非工作状态,并对***RAM和模乘运算电路的变量进行初始化,然后CPU使模乘运算电路置于工作状态,由模乘运算电路完成一次模乘运算,然后所述CPU调整模乘运算电路中的乘数、被乘数和结果的基址,使其分别对应于下一次模乘运算的乘数、被乘数和结果在***RAM中的存储位置,接着进行下一次模乘运算,所述CPU按该方式控制所述模乘运算电路按模幂运算的分解算法完成多次模乘运算后,得到模幂运算结果。
由此可见,本发明的模幂运算电路除了具有模乘运算电路的各种优点外,还在设计中采用了动态数据地址指针技术,在两次模乘运算之间无需调整数据的存储位置,只需要调整数据的地址指针即可,大大加快了模幂运算的速度。
具体实施方式
本发明的算法是在多精度Montgomery算法的基础之上,以多精度CIOS算法为基础并加以改进。算法中与现有多精度CIOS算法相同的参数含义相同,常数R、乘数x、被乘数y、模N都是s位r进制整数(一般是很大的二进制数,例如1024位或512位长),x=xs-1xs-2…x1x0,y=ys-1ys-2…y1y0,n=ns-1ns-2…n1n0;用来保存计算结果(和中间结果)的S有s+1位,即S=SsSs-1…S1S0;r=2k,K为机器的运算字长,可以为8、16、32或更大;C1、T1、n’[0]均为一位r进制数,具有固定的K位机器字长,其中C1用于存储运算结果的高位或进/借位,T1用于暂存运算结果的低位或和,n’[0]为常数。除此之外,本发明的算法中增加了一位二进制数C和一位r进制数T2,用于储存进位C1或/和C和S对应位相加的中间结果。在运算开始前,将S的各位及C1、T1、T2均赋上零值。
请同时参照图2,本发明算法的流程如下所述。
for i=0;i<s;i++ ∥令i为0,开始外循环,每次循环i值加1,当i等
{ 于s时,即出循环;步骤100
(C1,T1)=S[0]+x[0]y[i] ∥将S的第0位加上x第0位与y第i位的积,
结果的低位赋给T1,高位赋给C1;步骤102
(C,T2)=C1+S[1] ∥将C1加上S的第1位,和赋给T2,进位赋给C;
步骤104
m=T1n′[0]mod R ∥将T1与n’[0]相乘后,求其对模2k的余数(即取
低位),结果赋给m;步骤106
(C1,T1)=T1+mn[0]; ∥将T1加上m与n[0]的积,结果的低位赋给T1,
高位赋给C1;步骤108
for j=1;j<s;j++ ∥令j=1,开始内循环,每次循环j值加1,当j
等于s时,退出循环;步骤110
(C1,T1)=T2+x[j]y[i]+C1 ∥将T2与x的第j位与y的第i位的积以及进
位C1相加,低位赋给T1,高位赋给C1;步骤112
(C,T2)=S[j+1]+C1+C ∥将S的第j+1位与C1及C相加,和赋给T2,
进位赋给C;步骤114
(C1,T1)=T1+mn[j] ∥将T1加上m与n[j]的积,低位赋给T1,高位
赋给C1;步骤116
S[j-1]=T1; ∥将T1的值赋给S的第j-1位,并结束本次内
循环;步骤118
(C1,T1)=T2+C1 ∥将T2加上C1,和赋给T1,进位赋给C1;步骤
120
S[s-1]=T1 ∥将T1值赋给S的第s-1位;步骤122
S[s]=C1+C ∥将C1加上C,和赋给S的第s位,并结束本次
} 外循环;步骤124
C=0 ∥给C重新赋零值;步骤124
for j=0;j<s;j++ ∥令j=0,开始循环,每次循环j值加1,当j等于s
时,退出循环;步骤126
(C,y[j])=S[j]-n[j]-C ∥将S的第j位减去n的第j位和借位C,差赋给
y的第j位,借位赋给C;步骤128
(C,y[s])=S[s]-C ∥将S的第s位减去借位C,差赋给y的第s位,借
位赋给C;步骤130
if C=0 then return y[i] ∥如果借位C为零,返回y,否则返回S;步骤132
else return S[j]
本发明的算法将现有CIOS算法的二次内循环改为一个(该循环内还进行了移位运算),步骤112和116中的算式在同一内循环中交替进行,同时增加了步骤114对进位进行处理。可以看出,由于这一变化,本发明算法访问***RAM的次数明显减少。本发明算法的运算结果与现有CIOS算法一致,关于这点由于并非本发明的重点,所以不再详细说明,通过对一次外循环运算的推导即可证明。
在本发明算法的内循环中,只有3次读操作(x[j]、S[j+1]、n[j])和一次写操作(S[j-1]),不过由于存在5次加法运算,因此完成一次内循环运算的操作步为5步(第一次循环开始时,步骤112的算式中的变量值已经通过在先的步骤取得,这会在下文中会详细说明),完成内循环所需的总的操作步为5(s-2)=5s-10步,比现有CIOS算法少了s+1步,再乘以s-1次外循环,因此而一次模乘运算可以减少的操作步s2-1步(s可为32、64等)。
外循环中,本发明算法和现有CIOS算法相比,加、乘及读写操作的总次数略少,两者的所需的操作步基本相同。而最后的选择运算两者的算法是相同的。因此,本发明算法用协处理器实现时,运算速度比原算法明显提高。
图4是本发明实施例模乘算法协处理器的硬件结构图,根据完成的功能,可以将其划分为:数据寄存器、地址运算模块、乘法运算模块、加法运算模块、循环运算模块、逻辑控制模块、内部线路,以及一些特殊功能的模块。
数据寄存器,用于提供运算数据及存放中间运算结果。其中,x[i]寄存器7、y[i]寄存器11为乘数与被乘数寄存器,用来装载多精度的运算数据;T1寄存器8、m寄存器9、n[i]/S[i]寄存器12、T2寄存器48、以及C1寄存器49为中间结果寄存器,用来存放运算的中间结果,也作为运算数据参与运算;K位结果寄存器H 16、K位结果寄存器L 17用于存储乘法运算结果的高位和低位;n′[0]寄存器10为运算常数寄存器;上面提到的寄存器均为K位字长。Ycb寄存器51、Ycc寄存器52则是一位二进制的寄存器,用来保存加/减法运算结果的进位位;此外,还有一个0常数寄存器,和一个用于暂存需写入***RAM数据的RAM数据寄存器。
地址运算模块,用于提供对***RAM读写的地址。其中,n[i]基址寄存器24、x[i]基址寄存器25、y[i]基址寄存器26分别用于存放运算数据n、x、y数据的基地址,S[i]基址寄存器28和S[i]基址-1运算寄存器27用来存放运算结果S的基地址和基地址减1后的地址;选择器MUX 29用于选择当前参与运算的基址;地址运算器34用于将选择器MUX 29选择的基址与循环变量一起运算,得到当前地址值;RAM地址寄存器35用于接收地址运算器34的运算结果,作为对***RAM进行读、写操作时所用的地址。
乘法运算模块,用于执行乘法运算。其中,选择器MUX 13和选择器MUX 14分别与存放有本发明算法中乘法运算所涉及的被乘数x[i]、T1、m和乘数n’[0]、y[i]、n[i]的寄存器相连;K×K位乘法器15用于接收上述选择器的输入,运算结果的高位和低位分别输出到K位结果寄存器H16和K位结果寄存器L17中。
加/减法运算模块,用于执行加法运算。其中,选择器MUX 19(可由两个选择器组成)用于从K位结果寄存器、T1寄存器、T2寄存器、C1寄存器等等数据寄存器中取得进行加法运算的数据;K位加/减法器(带进位位)20用于完成加/减法运算,结果保存到C1、T1、C、T2、y[i]、n[i]/S[i]等数据寄存器中;而K位累加器18用于对加法运算的进位和K位结果寄存器H16的数据进行累加,以完成K字长的数与2K字长的积的加法运算。
逻辑控制模块,用于生成各种控制信号协调整个电路的工作,完成整个模乘协处理器的运算控制和时序控制。其中,操作步运算器37用于根据当前的操作步寄存器38中的内容以及循环变量比较器36的输出结果生成下一个时钟节拍操作步寄存器38的值;而操作步译码器39则根据当前操作步寄存器38的值通过译码生成各种控制信号协调整个电路的工作。时钟信号由外部引入。
循环运算模块,用于对内外循环运算进行计数和比较。其中,循环变量比较器36用于将循环变量运算器31的值与***配置寄存器46中设定的循环次数比较,反应内/外循环的进程;外部循环计数器A32和内部循环计数器B33用于将计数值与上述的基址寄存器在地址运算器34中作运算,生成运算过程中的多精度运算数据n、x、y在***RAM中的相应地址和运算结果S在***RAM中的对应地址;循环变量运算器31用于控制内部和外部循环运算的次数。
内部线路,协处理器内部的线路一方面通过接口与CPU、***RAM的数据总线和地址总线相连,其中n[i]基址寄存器24、x[i]基址寄存器25、y[i]基址寄存器26、S[i]基址寄存器28的写入受CPU的写入控制信号40、CPU数据4、CPU RD41和CPU地址42控制。而另一方面在协处理器内部,加/减法、乘法的选择器分别与算法中的加数、被加数,以及乘数和被乘数的寄存器通过数据线相连,而加/减法模块(K位加/减法器20和K位累加器18)的输出与T2寄存器48、C1寄存器49、T1寄存器8、m寄存器9、n[i]/S[i]等中间结果寄存器相连,完成相互间的数据传输。总之,对应于算法需要进行数据传输的两个部件间均通过内部线路连接在一起。但是加法、乘法、写地址,及读/写RAM操作在同一时间内不使用同一数据线,因而在同一操作步中可以并行运算。
特殊功能模块中,***使能寄存器47由CPU控制,用来启动和停止一次模乘运算的过程。
***配置寄存器46,用于内外循环的运算次数,对应于不同的运算数据长度,比如机器字长为32时,循环次数设为16或32分别对应于512或1024二进制位的运算数据。它与循环变量运算器31的数值比较,为操作步运算器37提供循环的进程信息。它的设置使***可以完成不同长度运算数据的模乘运算,提高本发明协处理器运算的灵活性。
操作步寄存器38中的内容对应的算法时序安排如下所述,其中的序号表示操作步寄存器38中的步骤数,序号后表示在本步骤中由操作步译码器39控制完成的操作。请同时参照本发明的算法流程,因为操作是根据本发明算法一步一步来进行的。
外循环开始
1、x[0]地址写入RAM地址寄存器35;
2、读取***RAM值(按RAM地址寄存器的地址读取,以下均同)入x[i]寄存器7;y[i]地址写入RAM地址寄存器35;
3、读取***RAM值入y[i]寄存器11;S[0]地址写入***RAM地址寄存器35;
4、执行x[i]寄存器7乘y[i]寄存器11;结果存入K位结果寄存器H16、K位结果寄存器L17;读取***RAM值入n[i]/S[i]寄存器12;S[1]地址写入RAM地址寄存器35;
5、执行乘法K位结果寄存器H16、K位结果寄存器L17加n[i]/S[i]寄存器12;结果存入C1寄存器49(存高位,下同)、T1寄存器8(存低位,下同);读取***RAM值入n[i]/S[i]寄存器12;n[0]地址写入RAM地址寄存器35;
6、执行C1寄存器49加n[i]/S[i]寄存器12;结果存入Ycb寄存器51(存进位)、T2寄存器48(存和);执行T1寄存器9乘n′[0]寄存器10;结果存于m寄存器9(因为要对结果求对2k的模,所以保留结果的低位);读取RAM值入n[i]/S[i]寄存器12;x[1]地址写入RAM地址寄存器35;
7、执行m寄存器9乘n[i]/S[i]寄存器12;结果存入K位结果寄存器H16、K位结果寄存器L17;读取***RAM值入x[i];
8、K位结果寄存器H16、K位结果寄存器L17加T1寄存器8;结果存入C1寄存器49、T1寄存器8;
内循环开始,此时内循环内部循环计数器B33的值为1
9、执行C1寄存器49加T2寄存器48;结果存入Ycc寄存器52(存进位)、T1寄存器8;执行x[i]寄存器7乘y[i]寄存器11;结果存入K位结果寄存器H16、K位结果寄存器L17;S[j+1]地址写入RAM地址寄存器35;
10、执行K位结果寄存器H16、K位结果寄存器L17加T1寄存器8;结果存入C1寄存器49、T1寄存器8;读取***RAM值入n[i]/S[i]寄存器12;n[j]地址写入RAM地址寄存器35;
11、执行带进位Ycb寄存器51的C1寄存器49加n[i]/S[i]寄存器12;结果存入Ycb寄存器51、T2寄存器48;读取***RAM值入n[i]/S[i]寄存器12;x[j+1]地址写入RAM地址寄存器35;
12、执行m寄存器9乘n[i]/S[i]寄存器12;结果存入K位结果寄存器H16、K位结果寄存器L17;执行带进位Ycc寄存器52的T2寄存器48加0常数53;结果存入Ycb寄存器51、T2寄存器48;读取***RAM值入x[i]寄存器7;S[j-1]地址写入RAM地址寄存器35;内循环内部循环计数器B33加1;
13、乘法结果K位结果寄存器H16、K位结果寄存器L17加T1寄存器8;结果高位存入C1寄存器49、低位存入T1寄存器8、RAM数据寄存器21并按RAM地址寄存器的地址将数据存入***RAM(存入操作***RAM的操作在数据写入RAM数据寄存器后的下一步中进行,放在此处为了说明方便);
重复9~13步,直到内部循环计数器B33的值j等于s时,内循环结束
14、执行C1寄存器49加T2寄存器48;结果的高位存入C1寄存器49、低位存入T1寄存器8和RAM数据寄存器21;S[j-1]地址写入RAM地址寄存器35;内部循环计数器B33加1(清零);
15、执行带进位Ycb寄存器的C1寄存器49加0常数53;结果存入Ycc寄存器52、Ycb寄存器51、RAM数据寄存器21,将RAM数据寄存器的值写入***RAM,S[j]地址写入RAM地址寄存器35,外部循环计数器A32加1;
16、将RAM数据寄存器的值写入***RAM,并判断跳转;
重复外循环,当外部循环计数器A32的值等于s时,结束外循环。
减法循环开始,内部循环计数器B33的初始值j为0
17、n[j]地址写入RAM地址寄存器35;
18、读取***RAM值入n[i]/S[i]寄存器12;S[j]地址写入RAM地址寄存器35;
19、n[i]/S[i]寄存器12存入T2寄存器48;读取***RAM值入n[i]/S[i]寄存器12;y[j]地址写入RAM地址寄存器35;内循环内部循环计数器B33加1;
20、执行带进位位Ycb寄存器51的n[i]/S[i]寄存器12减T2寄存器48减法;结果的借位存入Ycb寄存器51、差存入RAM数据寄存器21并在下一步存入***RAM;
重复17~20步,直到内部循环计数器B33的值等于s时,减法循环结束
21、S[j](j=s)地址写入RAM地址寄存器35;
22、读取***RAM值入n[i]/S[i]寄存器12;y[j]地址写入RAM地址寄存器35;
23、执行带进位位Ycb寄存器51的n[i]/S[I]寄存器12减0;结果存入Ycb寄存器51、RAM数据寄存器21并存入***RAM;内部循环计数器B33加1。
运算结束。结果保存在***RAM的S或y中。
通过上述步骤可以完成本发明实施例的模乘算法,可见完成一次内循环时确实是用了5步。
本发明的协处理器主要应用于智能卡集成电路中,实现多精度模乘算法的快速运算,但也可适用于其它进行大数模乘运算的电路中。需要说明的是,本发明并不局限于实施例中的具体电路,本领域的技术人员也可在本发明算法的基础上对电路加以变换。
图3中的***RAM控制信号选择器46并非设置于协处理器的内部,它用于选择***RAM的地址和控制信号,该选择器的控制由***使能寄存器47来实现。在算法运算时,***RAM的控制信号和地址信号由操作步译码器39和RAM地址寄存器35控制;当不进行算法运算的时候,***RAM的控制信号和地址信号由CPU RD41、CPU RD41、CPU数据4和CPU地址42控制。
当上述实施便的协处理器应用于智能卡电路时,与CPU、***RAM的连接和图1所示相同,完成一次大数模乘运算的工作流程如图4所述:
CPU 1首先将协处理器置于非工作状态,并对***RAM和协处理器的变量进行初始化。具体地说,通过将***使能寄存器47清除,使模乘算法协处理器置于非工作状态,将运算数据x、y、n写入***RAM 3。然后对协处理器2中的寄存器赋初值,即将x、y、n的基地址写入n[i]基址寄存器24、x[i]基址寄存器25、y[i]基址寄存器26,并将运算结果数据的基地址存入S[i]基址寄存器28;将运算常数写入n′[0]寄存器10,将运算数据的长度信息写入***配置寄存器46;步骤200
CPU 1通过将***使能寄存器47置位,使模乘算法协处理器置于工作状态,协处理器开始进行模乘运算;步骤202
CPU 1等待模乘算法协处理运算完毕,判断协处理器中Ycb寄存器的值,如果Ycb的值为零(无借位),运算结果存放在y[i]基址寄存器26为起始地址的***RAM中;如果Ycb的值为“1”(有借位),则运算结果存放在S[i]基址寄存器28为起始地址的***RAM中。步骤204
要完成一次RSA加密,需要完成的是一次模幂运算,其算法已经在背景技术中列出。开始模幂运算时,最初需存入***RAM的操作数为
x、
c和n,假设其超始地址为DZ1、DZ2和DZ3,并在RAM中开辟出存放模乘运算结果S的空间,假设其起始地址为DZ4。在CPU的控制下,协处理器先要完成MonPro(
x,
x)的模乘运算,而后又需将运算结果参与到下一次运算中去。由于每次模乘运算的乘数和被乘数不同,本发明采用了动态数据地址指针技术,在两次模乘运算之间无需调整数据的存储位置,只需要调整数据的地址指针即可,大大加快了模幂运算的速度,其具体方法如下。
本发明的智能卡电路在计算MonPro(
x,
x)时,CPU将乘数x[i],被乘数y[i],S[i],n[i]基址寄存器的基址分别指向
x、
x、n和S在***RAM中的起始地址,即DZ1、DZ1、DZ3、DZ4,其中x[i]和y[i]中存储的地址是相同的。当协处理完成一次模乘运算后,结果为S或y,S在***RAM中的起始地址不变,而y则替换了原有
x,存放在原来存放
x的空间中,其起始地址为DZ1。
如果下一次的模乘运算是MonPro(
c,
x),此时乘数和被乘数均发生了变化,CPU将x[i]基址寄存器的地址改为指向
c的起始地址DZ2,而将y[i]基址寄存器的地址指向上次模乘运算结果(S或y)的起始地址(DZ4或DZ1);如果是y,则需将S对应的RAM空间清零;如果是S,还需将S[i]基址寄存器的地址改为指向y的起始地址DZ1,并将RAM的对应空间清零,用来保存该次模乘算法中的S值。
如果下一次的模乘运算是MonPro(
x,
x),则需将x[i],y[i]基址寄存器的地址均指向上次模乘运算结果(S或y)的起始地址(DZ4或DZ1);如果是y,则需将S对应的RAM空间清零;如果是S,还需将S[i]基址寄存器的地址改为指向y的起始地址DZ1,并将RAM的对应空间清零,用来保存该次模乘算法中的S值。
按照以上方法,即可以通过改变协处理器中的基址寄存器的值,而实现对乘数和被乘数发生变化后的模乘运算。
可以理解,本发明的模乘、模幂运算电路虽然在实施例中是作为智能卡电路和协处理器,但其应用并不局限于此。