密码学课程设计之RSA

#coding:utf=8
from libnum import *
from random import *
def Miller_Rabin(n):
    if n == 2 or n == 3:
        return True
    if n & 1 == 0:
        return False
    s , d = 0 , n-1
    while d % 2 == 0:
        s += 1
        d //= 2
    for i in xrange(80):#进行80轮检验
        a = randrange(2,n-1)#按递增的方式产生随机数
        k = pow(a,d,n)      #k = a^d mod n
        if k == 1 or k == n-1:
            continue
        for r in xrange(s):
            k = pow(k,2,n) #k = a ^[(2^r)*d]  mod n
            if k == n-1:
                break
        else:
            return False
    return True
def gcd(a,b):#求最大公因数
    if a < b:
        a,b = b,a
    while(b!=0):
        temp = a % b
        a = b
        b = temp
    return a
def get_prime(n):
    if n <= 2:
        return False
    while True:
        t = '1'
        for i in range(n-2):
            t += str(randint(0,1))
        t += '1'
        t = int(t,2)
        if Miller_Rabin(t):
            return t
def ModInv(a,b):
    if b == 0:
        return 1,0
    else:
        k = a // b
        temp = a % b
        x1 , y1 = ModInv(b,temp)
        x , y = y1 , x1 - k * y1
        return x,y
def get_e(phi):
    while 1:
        e = randrange(10,50)
        if gcd(e,phi) == 1:
            return e
def RSA_en(plain):
    plain = s2n(plain)
    p = get_prime(1024)
    q = get_prime(1024)
    n = p * q
    phi = (p-1) * (q-1)
    e = get_e(phi)
    cipher = pow(plain,e,n)
    return p,q,n,e,cipher

def RSA_De(p,q,n,e,cipher):
    phi = (p-1)*(q-1)
    d,y = ModInv(e,phi)
    d = d % phi
    return n2s(pow(cipher,d,n))

flag = 'flag{y0u_found_it!}'
p,q,n,e,cipher = RSA_en(flag)
print "p=%d\nq=%d\nn=%d\ne=%d\ncipher=%d"%(p,q,n,e,cipher)
print "解密后的明文:%s"%(RSA_De(p,q,n,e,cipher))



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值