RSA—非对称加密算法
RSA:非对称加密算法
加解密原理如下:
已知:p,q,n,e,d,m,c
其中:p与q互为大质数,n=p*q
公钥Pk(n,e):加密使用,是公开的
私钥Sk(n,d):解密使用,不公开
c:明文 m:密文
一般情况下取e=65537
要求: e与(p-1)*(q-1)互质
(e*d)mod((p-1)*(q-1))=1
那么: m = c**e mod n
c = m**d mod n 例如: Bob:公钥(50429,65537)
Alice:私钥(50429,46793)
其中:n=50429,e=65537,d=46793,p=239,q=211,c=37
求:(1)Bob发送给Alice的密文m
(2)Alice收到m解密后的明文c 解:(1)m = c**e mod 50429 = 37**65537 mod 50429 = 25804
(2)c = m**d mod 50429 = 25804**46793 mod 50429 = 37
Python实现:
#-*- coding: UTF-8 -*- __author__ = ''
__date__ = '2016/4/18' from Tkinter import * class RSA_hash():
rsa_hash_en = []
rsa_hash_de = []
def __init__(self):
self.root = Tk()
self.root.title("RSA加/解密器")
self.root.geometry() Label(self.root, text="RSA加/解密器", font=("Arial",15), width=15).pack()
self.frm = Frame(self.root) self.frm_T = Frame(self.frm)
self.frm_Tp = Frame(self.frm_T)
Label(self.frm_Tp, text="素数p:", bg="red", font=("Arial",15), width=6).pack(side=LEFT)
self.var_p = Variable()
Entry(self.frm_Tp,textvariable=self.var_p, font=("Arial",12), width=24).pack(side=RIGHT)
self.frm_Tp.pack() self.frm_Tq = Frame(self.frm_T)
Label(self.frm_Tq, text="素数q:", bg="orange", font=("Arial",15), width=6).pack(side=LEFT)
self.var_q = Variable()
Entry(self.frm_Tq,textvariable=self.var_q, font=("Arial",12), width=24).pack(side=RIGHT)
self.frm_Tq.pack() self.frm_Te = Frame(self.frm_T)
Label(self.frm_Te, text="公钥e:", bg="yellow", font=("Arial",15), width=6).pack(side=LEFT)
self.var_Pke = Variable()
Entry(self.frm_Te,textvariable=self.var_Pke, font=("Arial",12), width=24).pack(side=RIGHT)
self.frm_Te.pack() self.frm_Td = Frame(self.frm_T)
Label(self.frm_Td, text="私钥d:", bg="green", font=("Arial",15), width=6).pack(side=LEFT)
self.var_Skd = Variable()
Entry(self.frm_Td,textvariable=self.var_Skd, font=("Arial",12), width=24).pack(side=RIGHT)
self.frm_Td.pack()
self.frm_T.pack() self.frm_B = Frame(self.frm)
self.frm_TB = Frame(self.frm_B)
Label(self.frm_TB, text="请输入:", bg="cyan", font=("Arial",15), width=6).pack(side=LEFT)
self.var_char = Variable()
Entry(self.frm_TB,textvariable=self.var_char, font=("Arial",12), width=24).pack(side=RIGHT)
self.frm_TB.pack() self.frm_MB = Frame(self.frm_B)
self.rsa_show = Text(self.frm_MB, bg="lavender", font=("Arial",12), width=32, height=6)
self.rsa_show.insert("1.0","")
self.rsa_show.pack()
self.frm_MB.pack() self.frm_BB = Frame(self.frm_B)
Button(self.frm_BB, text="清除", command=self.clear, font=("Arial",12), bd=3).pack(side=LEFT)
Button(self.frm_BB, text="加密", command=self.encrypt, font=("Arial",12), bd=3).pack(side=RIGHT)
Button(self.frm_BB, text="解密", command=self.decrypt, font=("Arial",12), bd=3).pack(side=RIGHT)
self.frm_BB.pack()
self.frm_B.pack()
self.frm.pack() def clear(self):
self.var_char.set("")
self.var_p.set("")
self.var_q.set("")
self.var_Pke.set("")
self.var_Skd.set("")
self.rsa_show.delete("1.0",END) def encrypt(self):
self.rsa_show.delete("1.0",END)
p = int(self.var_p.get())
q = int(self.var_q.get())
if self.isprimer(p,q):
phi = (p - 1) * (q - 1)
n = p * q
else:
self.rsa_show.insert("1.0","请重新输入p和q(要求p与q互素)")
e = int(self.var_Pke.get()) if self.isprimer(e,phi):
var_c = self.var_char.get()
if var_c.isdigit():
c = int(self.var_char.get())
m = c ** e % n
self.rsa_show.insert("1.0","密文为:%d" % m) else:
for i in var_c:
c = ord(i)
if self.isprimer(e,phi):
m = c ** e % n
self.rsa_show.insert(END,"密文依次为:%d\n" % m)
else:
self.rsa_show.insert("1.0","e与phi互相不为素数,请重新输入公钥e") def decrypt(self):
self.rsa_show.delete("1.0",END)
p = int(self.var_p.get())
q = int(self.var_q.get())
if self.isprimer(p,q):
phi = (p - 1) * (q - 1)
n = p * q
else:
self.rsa_show.insert("1.0","请重新输入p和q(要求p与q互素)")
d = int(self.var_Skd.get())
m = int(self.var_char.get())
e = int(self.var_Pke.get())
if self.isprimer(e*d,phi):
c = m ** d % n
if c in range(0,128):
self.rsa_show.insert("1.0","明文为: %d 或者 %s" % (c,chr(c)))
else:
self.rsa_show.insert("1.0","明文为: %d" % c)
else:
self.rsa_show.insert("1.0","您输入的密钥d不满足要求,请重新输入私钥d") #判断是否互素
def isprimer(self,g,f):
if g > f:
s = f
else:
s = g
L = []
for i in range(s,0,-1):
if g % i==0 and f %i ==0:
L.append(i)
if max(L) == 1:
return True
else:
self.var_p.set("")
self.var_q.set("")
def main():
rsa = RSA_hash()
mainloop() if __name__ == "__main__":
main()
下载 rsa_hash.exe(提取码:aef1)
RSA—非对称加密算法的更多相关文章
- SSH加密原理、RSA非对称加密算法学习与理解
首先声明一下,这里所说的SSH,并不是Java传统的三大框架,而是一种建立在应用层和传输层基础上的安全外壳协议,熟悉Linux的朋友经常使 用到一 个SSH Secure Shell Cilent的工 ...
- RSA非对称加密算法实现过程
RSA非对称加密算法实现过程 非对称加密算法有很多,RSA算法就是其中比较出名的算法之一,下面是具体实现过程 <?php /** */ class Rsa { /** * private key ...
- RSA非对称加密算法实现:Python
RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...
- RSA非对称加密算法实现:Golang
RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...
- RSA非对称加密算法实现:C#
RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...
- RSA非对称加密算法实现:Java
RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...
- RSA 非对称加密算法简述
RSA概述 首先看这个加密算法的命名.很有意思,它其实是三个人的名字.早在1977年由麻省理工学院的三位数学家Rivest.Shamir 和 Adleman一起提出了这个加密算法,并且用他们三个人姓氏 ...
- .NET Core加解密实战系列之——RSA非对称加密算法
目录 简介 功能依赖 生成RSA秘钥 PKCS1格式 PKCS8格式 私钥操作 PKCS1与PKCS8格式互转 PKCS1与PKCS8私钥中提取公钥 PEM操作 PEM格式密钥读取 PEM格式密钥写入 ...
- 【转载】非对称加密过程详解(基于RSA非对称加密算法实现)
1.非对称加密过程: 假如现实世界中存在A和B进行通讯,为了实现在非安全的通讯通道上实现信息的保密性.完整性.可用性(即信息安全的三个性质),A和B约定使用非对称加密通道进行通讯,具体 ...
随机推荐
- HDU 1056 - HangOver
递推 #include <iostream> using namespace std; ]; double c; int main() { f[]=; ;i<=;i++) f[i]= ...
- crontab指令详解
引用:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/06/3002602.html 具体指令请参考文章:linux指令. 详细版推荐原 ...
- Android Fragment(碎片)的使用
简介 在Android中Fragment为一种可以嵌入活动中的UI片段.能让程序更加合理地利用大屏幕的空间. 使用方法 1.我们首先新建的一个onefragment.xml文件. <?xml v ...
- AngularJS 不得不了解的服务 $compile 用于动态显示html内容
项目中一度纠结与AngularJS如何动态显示不同的html内容. 本来是希望直接使用下面的语句来实现: <div> </div> 但是很尴尬的是,这样不能识别出html标签, ...
- 滑动冲突的补充——Event的流程走向
一.之前分析的滑动冲突,并没有讲述event事件是如何分发到不同的控件 View的滑动冲突 现在分析一下滑动冲突event事件的流向 假设: 我们的一个事件为 点下——>左滑动一次——> ...
- cocos2d-x中的Tiled地图
cocos2d-x中的瓦片地图是通过tiledMap软件制作的,存档格式是.tmx格式.此软件的使用步骤简单总结如下: (1)制作瓦片地图 1 打开软件,软件界面如下图. 2. 新建地图(文件-> ...
- unity3D 锁屏再开程序崩溃
在Uniyt3d 调用Android Plugin 的时候,会出现锁屏后再开,程序就崩溃的的现象,解决办法就是在 AndroidManifest.xml 加入 android:configChang ...
- linux命令之pwd(print working drectory)
Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...
- hdu 1241 Oil Deposits_dfs or bfs
题意:给你n*m的图,@代表有油田的格子,*代表没油田的格子,如果油田旁边有油田就合并一起成为一个油田区,合并的方向为8个,现在问你油田合并过后,有多少个油田区 解法:用dfs or bfs dfs: ...
- cf #214div2
Dima and Guards Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u S ...