RSA密码系统的实现
RSA密码系统的实现
1.问题描述
RSA密码系统可具体描述为:取两个大素数p和q,令n=pq,N=(p-1)(q-1),随机选择整数d,满足gcd(d,N)=1,ed=1 modN。
公开密钥:k1=(n,e)
私有密钥:k2=(p,q,d)
加密算法:对于待加密消息m,其对应的密文为c=E(m)=me(modn)
解密算法:D(c)=cd(modn)
2.基本要求
p,q,d,e参数选取合理,程序要求界面友好,自动化程度高。
3. 实现提示
① 要实现一个真实的RSA密码系统,主要考虑对大整数的处理。P和q是1024位的,n取2048位。
② 产生大素数的方法分两种:
(1)确定性素数产生方法
确定性素数产生方法产生的数必然是素数。然而其产生的素数却带有一定的限制。假若算法设计不佳,便容易构造出带有规律性的素数,使密码分析者能够分析出素数的变化,进而可以猜到该系统中使用的素数。此类方法主要有两类,即基于Lucas定理和基于Pocklington定理的确定性素数产生方法。这里简单介绍基于Lucas定理的确定性素数产生方法。此方法需要求得素数n-1的全部素因子。
Lucas定理:设n∈N,存在一个正整数a,1<a<n且an-1≡1(modn),且对于n-1的每一个素q,均满足a(n-1)/qmod n≠l,则n为素数。
(2)概率性素数产生方法
概率性素数产生方法产生的数仅仅是伪素数。其缺点在于,尽管其产生合数的可能性很小,但是这种可能性仍然存在:其优点是产生的伪素数没有规律性,而且产生的速度也比较快。此类方法是生成大素数的主要方法,其中较著名的算法有:Miller Rabin算法、Solovay-Strassen算法等。本文讨论Miller Rabin算法。
Miller Rabin素性测试法是在实际中应用非常广的一种素性测试方案,可以用来判定某随机数是否为素数。其定义如下:
设n>2是一个奇数,设n-1=2sm,其中s是非负整数,m>0是奇数,设0<b<n,如果
bm≡-1(mod n),
或者存在一个r,0≤r<s,使得
b 2^r m≡-1(modn)
则称n通过以b为基的Miller-Rabin测试。
可以利用Miller-Rabin素性测试算法来随机生成大素数,随即生成一个奇数n>2,随即均匀的选取序列b1,b2...,bk∈{1,2,...,n-1},对n进行k次Miller-Rabin素性测试,如果每次输出都为“n可能是素数”,则n是合数的概率小于 1/4k当k足够大时,1/4k是一个十分小的数。
各位在具体实现时,为了提高速度最好以空间换时间,在主程序运行前先构造一个大素数表。
哪位可以尝试一下?