数学丢哪去了——记录两道RSA解密python脚本

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'
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值