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约定使用非对称加密通道进行通讯,具体 ...
随机推荐
- (重要) html概念之 input:name与id详解
实例: 带有两个文本字段和一个提交按钮的 HTML 表单: <form action="form_action.asp" method="get"> ...
- Lowest Common Ancestor of a Binary Search Tree、Lowest Common Ancestor of a Binary Search Tree
1.Lowest Common Ancestor of a Binary Search Tree Total Accepted: 42225 Total Submissions: 111243 Dif ...
- 【Android & iOS】应用升级实现
在移动应用中,都会有的一个功能就是应用版本升级,怎么实现这个功能呢? 基本的思路就是:对比当前使用的应用版本和最新的版本号,如果版本号不一致,就可以提示用户升级啦. Android中,可以通过一下方式 ...
- Linux下MySQL安装及命令使用
先rpm -qa mysql 查看是否安装 yum list |grep mysql 查看MySQL的一些包 yum install -y mysql-server mysql mysql-devel ...
- sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow
更多内容在这里查看 https://ahangchen.gitbooks.io/windy-afternoon/content/ ::-/com.company.product W/System.er ...
- SQL Server 影响dbcc checkdb的 8 种因素
第一种: 数据库的大小. 第二种: IO系统的速度. 第三种: 当前CPU的负荷. 第四种: 当前数据库的并发修改量.因为并发修改量越大维护数据库快照的成本就越高,dbcc 的过程中要创建快照,所以. ...
- 如何自定义MVC控件?
今天公司要写学习总结,想着想着还是先写一篇关于MVC内部什么东东的博客整理整理再发表吧,一举两得. 之前写过了路由.过滤器等.今天就研究一下怎么自定义MVC控件吧. 本人技术小菜,不喜勿喷.....( ...
- 一种全新的MEMS开关——高性能、快速、低能耗以及双稳态
这种开关最早由申军教授和研究生阮梅春发明,研究生埃里克·朗格卢瓦在简化结构和缩小尺寸上作了探索,黄志林用相同原理做出了MEMS光学镜子开关,曹志良改变设计.材料和工艺后制作出了能同步开关的矩阵.这种M ...
- 时间TDateTime相当于是Double,即双精度数64位,终于查到它用11位表示e,53位表示精度(整数小数一起),最前面一位表示正负
http://docwiki.embarcadero.com/RADStudio/Seattle/en/Internal_Data_Formats 关于Double的RTL函数,好像就一个:TrySt ...
- css 优先级
css优先级的四大原则: 原则一: 继承不如指定 如果某样式是继承来的永远不如具体指定的优先级高.例子1:CODE:<style type="text/css"> &l ...