2.1.5RSA算法中的计算问题
1.RSA的加密与解密过程
RSA的加密、解密过程都为求一个整数的整数次幂,再取模。
如果按其含义直接计算,则中间结果非常大,有可能超出计算机所允许的整数取值范围。
如上例中解密运算6677mod119,先求6677再取模,则中间结果就已远远超出了计算机允许的整数取值范围。
而用模运算的性质:
(a×b)modn=[(amodn)×(bmodn)]modn
就可减小中间结果再者,考虑如何提高加、解密运算中指数运算的有效性。
例如求x16,直接计算的话需做15次乘法。
然而如果重复对每个部分结果做平方运算即求x,x2,x4,x8,x16则只需4次乘法。
2.RSA密钥的产生
产生密钥时,需要考虑两个大素数p、q的选取,以及e的选取和d的计算。
因为n=pq在体制中是公开的,因此为了防止敌手通过穷搜索发现p、q,这两个素数应是在一个足够大的整数集合中选取的大数。
如果选取p和q为10100左右的大素数,那么n的阶为10200,每个明文分组可以含有664位(10200≈2664),即83个8比特字节,这比DES的数据分组(8个8比特字节)大得多,这时就能看出RSA算法的优越性了。
因此如何有效地寻找大素数是第一个需要解决的问题。
寻找大素数时一般是先随机选取一个大的奇数(例如用伪随机数产生器),然后用素性检验算法检验这一奇数是否为素数,如果不是则选取另一大奇数,重复这一过程,直到找到素数为止。
素性检验算法通常都是概率性的,但如果算法被多次重复执行,每次执行时输入不同的参数,算法的检验结果都认为被检验的数是素数,那么就可以比较有把握地认为被检验的数是素数。
2.1.6公钥密码体制的基本概念
在公钥密码体制以前的整个密码学史中,所有的密码算法,包括原始手工计算的、由机械设备实现的以及由计算机实现的,都是基于代换和置换这两个基本工具。
而公钥密码体制则为密码学的发展提供了新的理论和技术基础,一方面公钥密码算法的基本工具不再是代换和置换,而是数学函数;另一方面公钥密码算法是以非对称的形式使用两个密钥,两个密钥的使用对保密性、密钥分配、认证等都有着深刻的意义。
可以说公钥密码体制的出现在密码学史上是一个最大的而且是惟一真正的革命。
公钥密码体制的概念是在解决单钥密码体制中最难解决的两个问题时提出的,这两个问题是密钥分配和数字签字。
单钥密码体制在进行密钥分配时(看第5章),要求通信双方或者已经有一个共享的密钥,或者可籍助于一个密钥分配中心。
对第一个要求,常常可用人工方式传送双方最初共享的密钥,这种方法成本很高,而且还完全依赖信使的可靠性。
第二个要求则完全依赖于密钥分配中心的可靠性。
第二个问题数字签字考虑的是如何为数字化的消息或文件提供一种类似于为书面文件手书签字的方法。
1976年W.Diffie和M.Hellman对解决上述两个问题有了突破,从而提出了公钥密码体制。
2.2总体方案
要实现生成公钥和密钥的功能,必须先生成两个大素数。
方法是先设定随机种子为系统当前时间,然后随即生成两个100以内的随机数,并判断其是否为素数,取出这两个素数。
然后通过调用函数生成公钥对和密钥对,同时显示出结果到屏幕上。
随后可以用公钥对明文进行加密,将加密后的秘闻显示出来。
然后可以演示用密钥对密文进行解密,并将结果显示到屏幕上。
2.3功能模块
本系统含有两个功能模块:
(1)公钥和密钥生成模块:
可以生成个100以内的素数p和q,以及n、e、d;
(2)加密和解密模块:
可以显示加密后的数据,点击解密可显示解密后数据。
系统功能界面图如下:
图2-1系统功能界面图
3系统设计
3.1算法描述
RSA算法描述:
(1)密钥的产生
①选两个保密的大素数p和q。
②计算n=p×q,φ(n)=(p-1)(q-1),其中φ(n)是n的欧拉函数值。
③选一整数e,满足1④计算d,满足d·e≡1modφ(n),即d是e在模φ(n)下的乘法逆元,因e与φ(n)互素,由模运算可知,它的乘法逆元一定存在。
⑤以{e,n}为公开钥,{d,n}为秘密钥。
(2)加密
加密时首先将明文比特串分组,使得每个分组对应的十进制数小于n,即分组长度小于log2n。
然后对每个明文分组m,作加密运算:
c≡memodn
(3)解密
对密文分组的解密运算为:
m≡cdmodn
下面证明RSA算法中解密过程的正确性。
证明:
由加密过程知c≡memodn,所以
cdmodn≡medmodn≡m1modφ(n)modn≡mkφ(n)+1modn
要获得两个随机的小于100的素数,可以首先将系统当前时间设置为随机数种子,然后对生成的随机数取100模,然后调用判断素数的函数。
要判断一个属实否为素数,可以判断数n从2到n的开方,是否能整除n。
伪代码如下:
for(i从2到n的开方;i++)
{
if(n被i整除)
则n不是素数终止循环;
if(i>n的开方)
返回n为宿舍;
}
求最大公因子的算法:
Euclid算法就是用这种方法,因gcd(a,b)=gcd(|a|,|b|),因此可假定算法的输入是两个正整数,设为d,f,并设f>d。
Euclid(f,d)
①X←f;Y←d;
②ifY=0thenreturnX=gcd(f,d);
③