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约定使用非对称加密通道进行通讯,具体 ...
随机推荐
- QTestLib Tutorial
本学习指南介绍了如何使用QTestLib框架的一些特性,分为4章: 编写一个单元测试程序 数据驱动测试 模拟GUI事件 重复GUI事件 第一章 编写一个单元测试程序 文件列表: qtestlib/tu ...
- 自己动手打造html5星际迷航!
学习html5的canvas第三天,觉得还没过瘾,转眼就忘,于是趁着有空,准备弄个小游戏来玩!游戏应该需要注意性能,还有一些逻辑需要斟酌,我想还需要用户可修改性,也就是用户配置.好,开始我们简单但有趣 ...
- 常用的PHP正则表达式汇总
PHP中的常用正则表达式集锦: 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xf ...
- 【测试技术】ant中的for循环用法
有的时候,我们希望ant中也能类似脚本语言一样进行for循环,以实现一些重复性工作.由于ant核心包并未提供此功能,所以需要下载一个扩展包扔到ant的lib目录下去.详细步骤如下: 1.下载核心包:a ...
- Oracle监控指标
1.数据文件或数据设备 参考:http://f.dataguru.cn/thread-106901-1-1.html2.数据库日志空间活或回滚段(包括大小.设备.文件及可用率.日志空间竞争情况或回滚段 ...
- 【测试Json的多空格问题】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- sql 2000 "无法执行查询,因为一些文件缺少或未注册"的
sql 2000 "无法执行查询,因为一些文件缺少或未注册"的解决办法 在SQL server 2000中打开表查看数据的时候,提示说“无法执行查询,因为一些文件缺少或未注册” 用 ...
- poj 1664 放苹果_整数拆分
题意:略 用手机敲的代码真是泪流满面,终于过了 #include<iostream> using namespace std; int dp[110][110]; void solve() ...
- Windows下通过脚本快速修改IP地址
Windows下通过脚本快速修改IP地址 如果通过Windows的网络属性修改Ip/网关,真是太麻烦了. 经常要切换ip,所以我写了两个脚本: c:\办公室.bat netsh interface i ...
- 命名空间“Aspose”中不存在类型或命名空间名称“Slides”。
有可能引用的dll与项目的 .netFramework版本不同,需要确认两个版本是否相同.如果不同,项目右键->属性->应用程序.选择和引用的dll相同的版本.