RSA加密算法学习笔记

RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者

Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,

虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它

经成为最流行的公开密钥算法。

RSA密码生成规则:

1、随意选择两个大的质数pqp不等于q,计算N=pq

2、根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)

3、选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)

4、用以下这个公式计算dd× e ≡ 1 (mod (p-1)(q-1)),即d和e的乘积除(p-1)与(q-1)的乘积,余数为1。

5、将pq的记录销毁。

6、N,e,d组合构成公钥和私钥,(e,N)是公钥,(d,N)是私钥。

7、加密得到密文c: n^e \equiv c\ (\mathrm{mod}\ N)

8、解密得到明文n: c^d \equiv n\ (\mathrm{mod}\ 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


从密码对中选取一对即可,这里选取d=163,e=427。那么 公钥是 (35459,163),密钥是(35459,427)

假如明文c=10,加密后为n=26352。

随着计算机计算能力的提升,RSA的要求越来越高,1997年后开发的系统,用户应使用1024位密钥,证书认证机构应用2048位或以上。

吐槽一下编辑器太挫了,一行文字太长还自动隐藏了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值