Rsa简介
RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA公开密钥密码体制。加密算法E和解密算法D也都是公开的。
RSA 加密原理
步骤 说明 描述 备注
1 找出质数 p、q
2 计算公共模数 n = p * q
3 欧拉函数 φ(N) = (p-1)(q-1)
4 计算公钥e 1 < e< φ(N) E的取值必须是整数 ,e和 φ(N) 必须是互质数
5 计算私钥d e * d % φ(N) = 1
6 加密 C = M e mod n C:密文 M:明文
7 解密 M =C d mod n C:密文 M:明文
公钥=(e , n)
私钥=(d, n)
题目:已知p、q、c、dp、dq,求明文m
#coding:utf-8
import libnum
def egcd(a, b):
if (b == 0):
return 1, 0, a
else:
x, y, q = egcd(b, a % b) # q = GCD(a, b) = GCD(b, a%b)
x, y = y, (x - (a // b) * y)
return x, y, q
def mod_inv(a, b):
return egcd(a, b)[0] % b # 求a模b得逆
p = 12703830329315842567550642290233844551989413115578044857207995534378659933185699107475417626944054884619067220234567806128777927903935084746622131729293883
q = 13227646254242570726391882350245593196835449566365947429669506242811060886921793037704557843316080241482324099322834773980909766089991351871376104597517673
dp = 5052882267944459896063942392534379448810718093348381758286781811719311663310063302173760032982142586285079042828546912467138475161693026139283139414185935
dq = 8778400270622276402687979905385226435600717274058228963159983444750011003782436556279419782403013228295325114848834289405247546524131313104685306273705481
c = 126532907580099364343184491768646529625198629422625132086837277388311620436342303548372778988466885452676106624249993145364094931515804016688045515844551913407187806695920008237063017356722982532180950578657415816037585713774844783414877587745164572907604833861956805820826575330755221423176730512522016231899
invq=mod_inv(p,q)
mp=pow(c,dp,p)
mq=pow(c,dq,q)
m=((mp-mq)*invq%p)*q+mq
print(libnum.n2s(m))
题目:已知p,q,e,求私钥d
# coding:utf-8
def computeD(fn, e):
(x, y, r) = extendedGCD(fn, e)
#y maybe < 0, so convert it
if y < 0:
return fn + y
return y
def extendedGCD(a, b):
#a*xi + b*yi = ri
if b == 0:
return (1, 0, a)
#a*x1 + b*y1 = a
x1 = 1
y1 = 0
#a*x2 + b*y2 = b
x2 = 0
y2 = 1
while b != 0:
q = a / b
#ri = r(i-2) % r(i-1)
r = a % b
a = b
b = r
#xi = x(i-2) - q*x(i-1)
x = x1 - q*x2
x1 = x2
x2 = x
#yi = y(i-2) - q*y(i-1)
y = y1 - q*y2
y1 = y2
y2 = y
return(x1, y1, a)
p = 184447441856923584506972548629664462921
q = 210984885740565358250291732634631217851
e = 65537
n = p * q
fn = (p - 1) * (q - 1)
d = computeD(fn, e)
print d
# -*- coding:utf8 -*-
import gmpy2
import libnum
from Crypto.PublicKey import RSA
def foo():
A=RSA.importKey(open('public.key','rb').read())
n=A.n
e=A.e
#n=98432079271513130981267919056149161631892822707167177858831841699521774310891
#e=65537
#经过yafu分解或者使用在线分解网站http://www.factordb.com/
p=302825536744096741518546212761194311477
q=325045504186436346209877301320131277983
assert n==p*q
d=gmpy2.invert(e,(p-1)*(q-1))
c1=libnum.s2n(open('encrypted.message1','rb').read())
m=pow(c1,d,n)
print libnum.n2s(m)
c2=libnum.s2n(open('encrypted.message2','rb').read())
m=pow(c2,d,n)
print libnum.n2s(m)
c3=libnum.s2n(open('encrypted.message3','rb').read())
m=pow(c3,d,n)
print libnum.n2s(m)
pass
if __name__ == '__main__':
foo()
print 'ok'