RSA的算法涉及三个参数,n、e、d。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质;再选择d,要求(d*e1)mod((p-1)*(q-1))=1。
(n,e),(n,d)就是密钥对。其中(n,e)为公钥(n,d)为私钥。[1] 
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^d mod n;B=A^e mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e和d可以互换使用,即:
A=B^d mod n;B=A^e mod n;
 
#!/usr/bin/env python
#coding -*- utf:8 -*-
import math
import random #生成素数数组
def prime_array():
arraya = []
for i in range(2,100): #生成前100中的素数,从2开始因为2是最小的素数
x = prime(i,2) #i为素数是返回True,则将x加入arraya数组中;2为测试值
if x:
arraya.append(i)
return arraya #判断是否为素数
def prime(n, test_divisor):
if math.sqrt(n) < test_divisor:
return True #为素数时返回True
if n % test_divisor == 0:
return False #不为素数时返回Fasle
else:
return prime(n, test_divisor+1) #找出与(p-1)*(q-1)互质的数e
def co_prime(s):
while True:
e = random.choice(range(100))
x = gcd(e,s)
if x==1: #如果最大公约数为1,则退出循环返回e
break
return e #求两个数的最大公约数
def gcd(a,b):
if b==0:
return a
else:
return gcd(b, a%b) #根据e*d mod s = 1,找出d
def find_d(e,s):
for d in range(100000000): #随机太难找,就按顺序找到d,range里的数字随意
x = (e*d) % s
if x==1:
return d #生成公钥和私钥
def main():
a= prime_array()
print("前100个素数:",a)
p = random.choice(a)
q = random.choice(a)
print("随机生成两个素数p和q. p=",p," q=",q)
n = p * q
s = (p-1)*(q-1)
#print("The p is ", p)
#print("The q is ", q)
#print("The n(p*q) is ",n)
e = co_prime(s)
print("根据e和(p-1)*(q-1))互质得到: e=", e)
d = find_d(e,s)
print("根据(e*d) 模 ((p-1)*(q-1)) 等于 1 得到 d=", d)
print("公钥: n=",n," e=",e)
print("私钥: n=",n," d=",d)
pbvk=(n,e,d)
return pbvk #生成public key公钥或private key私钥
#zx==0 公钥 zx==1 私钥
#a为元组(n,e,d)
def generate_pbk_pvk(a,zx):
pbk = (a[0],a[1]) #public key公钥 元组类型,不能被修改
pvk = (a[0],a[2]) #private key私钥
#print("公钥: n=",pbk[0]," e=",pbk[1])
#print("私钥: n=",pvk[0]," d=",pvk[1])
if zx==0:
return pbk
if zx==1:
return pvk #加密
def encryption(mw, ned):
# 密文B = 明文A的e次方 模 n, ned为公钥
#mw就是明文A,ned【1】是e, ned【0】是n
B = pow(mw,ned[1]) % ned[0]
return B #解密
def decode(mw, ned):
# 明文C = 密文B的d次方 模 n, ned为私钥匙
#mw就是密文B, ned【1】是e,ned【1】是d
C = pow(mw,ned[1]) % ned[0]
return C if __name__=='__main__':
pbvk = main()
pbk = generate_pbk_pvk(pbvk, 0) #公钥 if 0 return pbk if 1 return pvk
A = int(input("请输入明文: "))
print("加密中....")
B = encryption(A,pbk) #加密
print("生成的密文是: ", B)
pvk = generate_pbk_pvk(pbvk, 1) #私钥
print("解密中....")
C = decode(B,pvk) #解密
print("解密后的明文是: ", C)
if A==C:
print("加密前的明文和解密后的明文一样,成功!!!")

RSA加密解密(python版)的更多相关文章

  1. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  2. python下RSA加密解密以及跨平台问题

    Reference:  http://www.cnblogs.com/luchanghong/archive/2012/07/18/2596886.html 项目合作需要,和其他网站通信,消息内容采用 ...

  3. python RSA加密解密及模拟登录cnblog

    1.公开密钥加密 又称非对称加密,需要一对密钥,一个是私人密钥,另一个则是公开密钥.公钥加密的只能私钥解密,用于加密客户上传数据.私钥加密的数据,公钥可以解密,主要用于数字签名.详细介绍可参见维基百科 ...

  4. Cryptopp iOS 使用 RSA加密解密和签名验证签名

    Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...

  5. 使用RSA加密在Python中逆向shell

    i春秋翻译小组-Neo(李皓伟) 使用RSA加密在Python中逆向shell 这是一个关于使用RSA加密编程逆向shell的python教程. 我想提一下,这篇文章更多的是关于理解shell中涉及的 ...

  6. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  7. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  8. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...

  9. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  10. C# Java间进行RSA加密解密交互

    原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...

随机推荐

  1. 360路由器刷openwrt、不死uboot、双系统 、wifi中继

    该类教程网上有很多,但是很多不全,给小白用户造成了很多困扰.我也是按照网上的教程刷了半天,才熟悉了是怎么个回事.这里整理成教程. 注意: 请看教程步骤走,不要跳跃性刷机.不懂的术语.软件,若本文无介绍 ...

  2. 批处理集锦——(5)使用dir查找文件

    eg dir /a-d /s /b *.bat -d表示不显示.bat结尾的文件夹

  3. 细数改善WPF应用程序性能的10大方法

    WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系 ...

  4. 1.安装Redis

    首要条件:安装VMware,在虚拟机中安装CentOS. 安装步骤: 1.打开终端(Terminal) 2.在终端输入:wget http://download.redis.io/releases/r ...

  5. 反质数问题,求不大于n的最大反质数

    反质数:设f(n)表示n个约数的个数,如果对于任意x有0<x<n, f(x) < f(n),那么n就是一个反质数 我们都知道对于任意一个数n,都可以用质数乘积的形式表示出来:x = ...

  6. MYSQL线程池总结(一)

    线程池是Mysql5.6的一个核心功能,对于服务器应用而言,无论是web应用服务还是DB服务,高并发请求始终是一个绕不开的话题.当有大量请求并发访问时,一定伴随着资源的不断创建和释放,导致资源利用率低 ...

  7. RAC碎碎念

    1. 如何查看Oracle是否启动了RAC.  SQL> show parameter cluster_database; NAME TYPE VALUE ------------------- ...

  8. Oracle Linux

    一. Oracle Linux下载地址 ftp://ftp.linux.org.uk/pub/distributions/enterprise/ 该地址包含Oracle Linux 6以上版本及RHE ...

  9. MySQL性能优化的最佳21条经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  10. (转)JS模块化编程之AMD规范

    模块的规范 原文地址 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有 ...