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实现的主要内容,如果未能解决你的问题,请参考以下文章