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约定使用非对称加密通道进行通讯,具体 ...
随机推荐
- C# 当前程序所有线程
using System.Linq; var threads = System.Diagnostics.Process.GetCurrentProcess().Threads;var count = ...
- java面试题大全-基础方面
Java基础方面: 1.作用域public,private,protected,以及不写时的区别答:区别如下:作用域 当前类 同一package 子孙类 ...
- SQL 临时表或表变量替代游标
1.如果表没有自动增长的标识列(int) 使用临时表 SELECT IDENTITY(int) NewID ,.. INTO #tmp FROM YouTable 2.表有标识列 使用表变量 INSE ...
- windows下开发PHP扩展(无需Cygwin)
第一步:准备 1.php源码包和windows下的二进制包,以及安装Visual C++,并把Microsoft Visual Studio/Common/MSDev98/Bin的绝对路径添加到win ...
- C++14介绍
C++14标准是 ISO/IEC 14882:2014 Information technology -- Programming languages -- C++ 的简称[1] .在标准正式通过之 ...
- Activity和View的区别:
Activity和View的区别: activity相当于控制部分,view相当于显示部分.两者之间是多对多的关系,所有东西必须用view来显示. viewGroup继承自view,实现了ViewM ...
- cf466C Number of Ways
C. Number of Ways time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 栈的C数组实现
栈是一种先进后出的数据结构.栈的基本操作包括:入栈,出栈,初始化栈,清空栈,遍历栈. C代码如下: #include <stdio.h> #define MaxSize 20 typede ...
- poj 3254 Corn Fields_状态压缩dp
感谢:http://www.cnblogs.com/ka200812/archive/2011/08/11/2135607.html 让我搞懂了. #include <iostream> ...
- C# 将XML转换成DataSet【转】
XmlDocument xml = new XmlDocument();xml.LoadXml(str); //str:具有xml格式的字符串 XmlNodeReader reader = new X ...