RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者
Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,
虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已
经成为最流行的公开密钥算法。
RSA密码生成规则:
1、随意选择两个大的质数p和q,p不等于q,计算N=pq。
2、根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)
3、选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)
4、用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1)),即d和e的乘积除(p-1)与(q-1)的乘积,余数为1。
5、将p和q的记录销毁。
6、N,e,d组合构成公钥和私钥,(e,N)是公钥,(d,N)是私钥。
7、加密得到密文c:
8、解密得到明文n:
RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。
从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。当密码位数足够大时,以现有计算机的计算能力无法破解。
这里涉及到质数,如何求质数,质数的定义是只能被自身和1整除的数。根据定义,很容易判断一个自然数是否为质数,python代码如下:
def is_prime_number(x):
'''
判断是否质数
'''
result = True
for i in xrange(x):
if i < 2:
continue
if x % i == 0:
result = False
break
return result
算法第三步中涉及到一个数学定义互质,互质数的定义是公约数只有1的两个数,叫做互质数。如何求公约数呢?这里使用辗转相除法求解。辗转相除法又称欧几里得算法,首次出现在欧几里得的《几何原本》,中国最早出现于东汉时的《九章算术》。
辗转相除法的原理是:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
基于此原理,代码实现如下:
def greatest_common_divisor(x,y):
'''
求x和y的最大公因数
'''
if x < y:
temp = y
y = x
x = temp
while x % y != 0:
temp = y
y = x % y
x = temp
return y
那么开始构造自己的RSA吧,使用is_prime_number得到两个质数。这里让p=59,q=601,那么N=p*q=35459,T = (p-1)*(q-1) = 34800。
接下来通过第三四步求出d和e,代码如下:
if __name__ == '__main__':
e_list = []
for i in xrange(34800):
if i < 2:
continue
if greatest_common_divisor(i,34800) == 1:
e_list.append(i)
for e in e_list:
for d in xrange(34800):
if d < 2:
continue
if (e*d) % 34800 == 1:
print e,d
假如明文c=10,加密后为n=26352。
随着计算机计算能力的提升,RSA的要求越来越高,1997年后开发的系统,用户应使用1024位密钥,证书认证机构应用2048位或以上。
吐槽一下编辑器太挫了,一行文字太长还自动隐藏了。。