RSA公钥算法

来源:互联网 发布:专升本网络教育 编辑:程序博客网 时间:2024/05/17 00:05

RSA算法流程:
1. 找出两个大素数p和q
2. 计算 n=p*q,计算Φ(n)=(p-1)*(q-1), Φ(n)为数论当中的欧拉函数
3. 找出小于Φ(n),且与Φ(n)互素的整数e,然后求出d使得 d*e = 1 modΦ(n)
4. 加密 C=M**e mod n,解密:M = C**d mod n,即e为公钥,d为私钥
,C为密文,M为明文

!/usr/bin/env python-*- coding:utf-8 -*-import mathdef prime_test(prime):"""判断一个数是否是素数"""    end = int(math.sqrt(prime) + 1)    for i in xrange(2, end):        if prime % i == 0:  #不是素数            return False        else:            return True #是def multip_inverse(e, z):"""返回d = e^(-1) mod z,即返回e 的模z的乘法逆元,公式:d * e % z = 1"""    for i in xrange(1, z):        if i * e % z == 1:            return i# a should be greater than bdef gcd (a, b):         //def extended_Euclid(e, z)也可以用欧几里得拓展算法求模拟元"""Compute GCD(greatest common divisor) of two numbers用辗转相除法,求两个数的最大公约数"""#print 'a =%d b= %d' % (a, b)    if a < b:        (a, b) = (b, a) # 交换a和b    elif b == 0:        return a# 返回    else:        return gcd(b, a % b)# 递归调用程序本身def input_prime():"""输入素数p"""    while True :        p = int(raw_input("请输入一个小素数p ( 2 < p < 1000) : "))        if prime_test(p) == True:            return p        else:            print "数字%d不是素数! " % pdef extended_Euclid(e, z):    (x1, x2, x3) = (1, 0, z)    (y1, y2, y3) = (0, 1, e)    while True:        if y3 == 0:            return False        else y3 == 1:            return y2    div = x3 / y3    (t1, t2, t3) = (x1 -div*y1, x2 - div*y2, x3 - div*y3)    (x1, x2, x3) = (y1, y2, y3)    (y1, y2, y3) = (t1, t2, t3)    return x1%edef main():    p = input_prime()    q = input_prime()    n = p * q   # 计算n的值    z = (p-1) * (q-1)   # 计算z的值    print "p = ", p    print "q = ", q    print "n = p * q =", n    print "z = (p-1) * (q-1) =", z    while True:        e = int(raw_input('请输入一个数字e:(1 < e < z) 且e,z互为质数:'))        if e <= 1 or e >= z :            print "输入e的范围无效: (1<e< %d) 请重新输入!", z            continue        if gcd(e, z) != 1:            print '%d 与 %d不是互为质数.' % (e, z)            break    d = multip_inverse(e, z)    print "公钥(e, n)为: (%d , %d)" % (e, n)    print "私钥(d, n)为: (%d , %d)" % (d, n)    while True:        message = int(raw_input('请输入你要加密的数字明文message (1 <= message < n):'))        if  message < 1 or message >= n :            print "message必须小于n,请重新输入"            break    print "message = ", message    print "正在对message进行加密..."    print "\t 加密公式为: cipher = (message ** e) % n"    cipher = ( message ** e) % n# 加密得出密文cipher    print "加密后的密文cipher为:", cipher    print "正在对cipher进行解密..."    print "\t 解密公式为:plain_text = (cipher ** d) % n"    plain_text = (cipher ** d) % n  # 解密得出明文plain_text    print "解密后的明文plain_text为:", plain_text    if message == plain_text:   # 加密解密是否成功        print '\t', '*' * 50        print "RSA 加密-解密 测试成功!"    else:    print '程序测试失败!'if __name__ == '__main__':    main()
0 0
原创粉丝点击