RSA加密解密(python版)
#!/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版)的更多相关文章
- python rsa 加密解密 (编解码,base64编解码)
最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...
- python下RSA加密解密以及跨平台问题
Reference: http://www.cnblogs.com/luchanghong/archive/2012/07/18/2596886.html 项目合作需要,和其他网站通信,消息内容采用 ...
- python RSA加密解密及模拟登录cnblog
1.公开密钥加密 又称非对称加密,需要一对密钥,一个是私人密钥,另一个则是公开密钥.公钥加密的只能私钥解密,用于加密客户上传数据.私钥加密的数据,公钥可以解密,主要用于数字签名.详细介绍可参见维基百科 ...
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
- 使用RSA加密在Python中逆向shell
i春秋翻译小组-Neo(李皓伟) 使用RSA加密在Python中逆向shell 这是一个关于使用RSA加密编程逆向shell的python教程. 我想提一下,这篇文章更多的是关于理解shell中涉及的 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- openssl evp RSA 加密解密
openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...
- C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法
因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...
- C# Java间进行RSA加密解密交互
原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...
随机推荐
- Node.js与Sails~中间查询语言Waterline
回到目录 上讲主要说了如何配置sails的持久化机制,这讲主要说一下实现持久化时的增删改查的语法,在sails里使用了和mongodb风格类似的waterline查询语言,使用简单,语法生动,下面我们 ...
- Atitit sql执行计划
Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...
- iOS开发——高级技术&广告服务
广告服务 上 面也提到做iOS开发另一收益来源就是广告,在iOS上有很多广告服务可以集成,使用比较多的就是苹果的iAd.谷歌的Admob,下面简单演示一下如何 使用iAd来集成广告.使用iAd集成广告 ...
- Python - 动手写个ORM
Python - 动手写个ORM 任务: 模拟简单的ORM - Object Relational Mapping 为model添加create方法 代码很简单,直接上 字段类型类 class Fie ...
- 创建oracle数据库job服务:PlSqlDev操作job
PlSqlDev操作job 创建job 1.选择job文件夹,右键 2.点击新建 3.对应填写完成,可以点击“查看SQL”查看sql语句,确定无误后,点击“应用”即创建完成 4.此时, ...
- Ext.util.TaskRunner定时执行任务
Ext.util.TaskRunner能够提供多线程的定时任务,该类提供了对多线程任务的管理,可以通过Ext.TaskManager来创建Ext.util.TaskRunner的一个实例,也可以自行创 ...
- 【WP 8.1开发】自定义(RAW)通知的使用
继续前面的话题,还是推送通知.上一篇文章中遗留了RAW通知的推送没有给各位演示,特特地留到现在,不为别的,只为这个RAW通知有点意思,玩起来会比较有意思.官方文档将RAW通知译为“原始通知”,这里还是 ...
- java集合框架之Set
Set集合 元素不可以重复,是无序. 方法与list相同 HashSet:不保证set的迭代顺序,不同步,内部数据结构是哈希表 如果存自定义对象则需要覆盖equals和hashCode方法 先比较ha ...
- Kubernetes如何使用kube-dns实现服务发现
大纲: • Kubernetes中如何发现服务 • 如何发现Pod提供的服务 • 如何使用Service发现服务 • 如何使用kube-dns发现服务 ...
- 面试准备 - HashTable 的C#实现 开放地址法
Hashtable是很经常在面试中遇到的数据结构,因为他的O(1)操作时间和O(n)空间 之所以自己写一份是因为: 加深对于hashtable的理解 某些公司面试的时候需要coding....... ...