RSA算法与Python实现

Posted TaiJi1985

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RSA算法与Python实现相关的知识,希望对你有一定的参考价值。

RSA算法与Python实现

yangtf

功能

RSA加密是最常见的非对称加密算法,基于大数分解难题。 两个很大的素数相乘很容易,但想根据成绩解出因子则很难。

如果数不够大,还是很容易分解的。

素数

素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。

互质数(或互素数)

公约数只有1的两个数,叫做互质数

模指数运算

取模就是 做一个整除,取余数作为结果,如 13 % 3 = 1 ,因为13除以3,余1
模指数运算就是先做指数运算,取其结果再做模运算。

RSA算法

(1)先随机选择两个足够大的素数

(2)计算乘积 n = pq ,这个n就是那个很难分解的大数,如果pq太小就尴尬了,很容易被爆破。

(3)计算f(n) = (p-1)*(q-1) ,p和q 不能让任何人知道。n是公开的。

(4)找到一个与f(n)互质的数e,使其1

import math
p=9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q=11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e=65537
c=83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
n=p*q



fn=long((p-1)*(q-1))

# 计算d,使得 de≡1 mod f(n)    
# 意思是  d*e % fn == 1 。 d和e的乘积取模等于1 
# 也就是说 d*e = 1 + fn*i  (i为整数,就是 d*e / fn 的商)
# 下面的算法是  ( fn*i+i ) % e  如果结果为零,得到结果就是d  

i = 1
while(True):
    x=(i*fn)+1
    if(x%e==0):
        d=x/e
        break
    i=i+1

print "d=", d
print "i=",i

# 另外一个等价公式是  d ≡e-1 mod f(n)   , 意思为 d % f(n) == (e-1)%f(n) , 也就是说 (e-1)+ j*fn = d + f(n)*i 
# 这个比较难算了。
d= 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
i= 32394
KU = (e,n) # 公钥
PU = (d,n) # 私钥
M = 5577446633554466577768879988 # 明文
C = pow(M,e,n ) # M的e次方 模上n
print "C = " , C
C =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
MC = pow(C,d,n)
print "MC = ",MC
MC =  5577446633554466577768879988
M == MC
True

可以看到解密后的MC和原文M相等

Cite :

https://www.cnblogs.com/jiftle/p/7903762.html

http://www.shiyanbar.com/ctf/1979

https://blog.csdn.net/sinat_33769106/article/details/79999090

还有另外一个计算D的方法,试一下。

def computeD(fn, e):
    (x, y, r) = extendedGCD(fn, e)
    if y < 0:
        return fn + y
    return y

def extendedGCD(a, b):
    if b == 0:
        return (1, 0, a)
    x1 = 1
    y1 = 0
    x2 = 0
    y2 = 1
    while b != 0:
        q = a / b
        r = a % b
        a = b
        b = r
        x = x1 - q*x2
        x1 = x2
        x2 = x
        y = y1 - q*y2
        y1 = y2
        y2 = y
    return(x1, y1, a)

D = computeD(fn,e)
print D
56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
D == d
True

简单的证明

C=Me%n C = M e % n
M=Cd%n=Med%n=M1%n=M M = C d % n = M e d % n = M 1 % n = M
为什么ed = 1 ,在整个公式里,都是做的模运算 ,生成过程决定了 ed % n = 1
上述公式用latex表述。

以上是关于RSA算法与Python实现的主要内容,如果未能解决你的问题,请参考以下文章

python实现网页登录时的rsa加密流程

python RSA加密解密及模拟登录cnblog

python2实现RSA算法

Python使用rsa模块实现非对称加密与解密

登录页面之RSA加密

rsa算法中p,q,n,e,d一般大小都为多少啊?