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
- RSA公钥算法
- RSA公钥算法详解
- RSA公钥密码算法
- 公钥密码RSA算法优化分析
- 离散数学中RSA公钥算法问题
- OpenSSL应用之公钥算法RSA
- RSA公钥密码算法的实现
- RSA公钥算法是怎么回事(一)
- RSA公钥算法是怎么回事(二)
- RSA秘钥算法
- 公钥密码系统及RSA公钥算法
- 公钥密码系统及RSA公钥算法
- 公钥密码系统及RSA公钥算法
- 公钥密码系统及RSA公钥算法
- RSA算法生成公钥和私钥
- PHP RSA 算法生成公钥和私钥
- RSA公钥密码算法的原理及实现(一)
- RSA公钥密码算法的原理及实现(二)
- linux基础小知识(3)--static与externx
- 面向对象—static关键字
- sqlserver镜像不同步了
- 整数中1出现的次数(从1到n整数中1出现的次数)
- Android simpleAdapter使用方法--实现消息列表
- RSA公钥算法
- caffe训练提示top blob 'data' produced multiple sour解决办法
- python 除法保留两位小数点
- hive中的本地模式
- 侧滑菜单
- Logistic回归
- LCD MIPI DSI简析系列之二
- 卷积平滑数据原理(有边缘效应)
- 如何关闭MyEclipse 的synchronizing script resources with Tern server