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—非对称加密算法的更多相关文章

  1. SSH加密原理、RSA非对称加密算法学习与理解

    首先声明一下,这里所说的SSH,并不是Java传统的三大框架,而是一种建立在应用层和传输层基础上的安全外壳协议,熟悉Linux的朋友经常使 用到一 个SSH Secure Shell Cilent的工 ...

  2. RSA非对称加密算法实现过程

    RSA非对称加密算法实现过程 非对称加密算法有很多,RSA算法就是其中比较出名的算法之一,下面是具体实现过程 <?php /** */ class Rsa { /** * private key ...

  3. RSA非对称加密算法实现:Python

    RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...

  4. RSA非对称加密算法实现:Golang

    RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...

  5. RSA非对称加密算法实现:C#

    RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...

  6. RSA非对称加密算法实现:Java

    RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...

  7. RSA 非对称加密算法简述

    RSA概述 首先看这个加密算法的命名.很有意思,它其实是三个人的名字.早在1977年由麻省理工学院的三位数学家Rivest.Shamir 和 Adleman一起提出了这个加密算法,并且用他们三个人姓氏 ...

  8. .NET Core加解密实战系列之——RSA非对称加密算法

    目录 简介 功能依赖 生成RSA秘钥 PKCS1格式 PKCS8格式 私钥操作 PKCS1与PKCS8格式互转 PKCS1与PKCS8私钥中提取公钥 PEM操作 PEM格式密钥读取 PEM格式密钥写入 ...

  9. 【转载】非对称加密过程详解(基于RSA非对称加密算法实现)

    1.非对称加密过程:         假如现实世界中存在A和B进行通讯,为了实现在非安全的通讯通道上实现信息的保密性.完整性.可用性(即信息安全的三个性质),A和B约定使用非对称加密通道进行通讯,具体 ...

随机推荐

  1. java web 之 WebRoot和WebContent目录

    WebRoot和WebContent都是程序的根文件夹,无本质区别,一下是两者的共同点和不同点: 共同点:都有一个WEB-INF文件夹,其下文件不可直接访问: WEB-INF是安全目录,所谓安全,就是 ...

  2. MySQL 初学笔记 ② -- MySQL安装

    1. Ubuntu安装 sudo apt-get install mysql-server //安装mysql服务 sudo apt-get install mysql-client // sudo ...

  3. openstack安装记录(二)keystone安装

    先决条件 在你配置 OpenStack 身份认证服务前,你必须创建一个数据库和管理员令牌. 完成下面的步骤以创建数据库: 用数据库连接客户端以 root 用户连接到数据库服务器: $ mysql -u ...

  4. C语言基础09

    指向结构体变量的指针叫做结构体指针: typedef struct { int num; char name[30];    // char *name; 程序会崩溃,*name本身是指针,没有什么空 ...

  5. Linux回归篇-基础恶补

    前言:  LINUX在之前仅仅了解一些皮毛知识,最近计划深入研究大数据,LINUX当然少不了,所以借此良机将LINUX也顺带添加进入学习的目录之中.为了知识的全面性,本文先恶补一下LINUX的基础,作 ...

  6. QT:给Widget设置背景图片——设置Widget的调色板,调色板使用图片和背景色

    QT:给Widget设置背景图片 1 /*2 * set background image3 */4 QPixmap bgImages(":/images/bg.png");5 Q ...

  7. Inno Setup 安装前卸载原程序(转)

    很多時候我們需要在安裝文件之前卸載原有的程序而不是覆盖安装,本文的code就是实现了这样的功能. 实现原理是:從注冊表'UninstallString'項中读取卸载信息,用Exec进行静默卸载. 下面 ...

  8. 【PAT】1025. PAT Ranking (25)

    题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1025 题目描述: Programming Ability Test (PAT) is orga ...

  9. Unix/Linux环境C编程入门教程(24) MySQL 5.7.4 for Red Hat Enterprise 7(RHEL7)的安装

    远观历史, MySQL的主要目的是为了能够在单处理器核心的商业服务器上运行.如今MySQL的一个变化用户可能不会注意到,那就是甲骨文已经开始重新架构MySQL的代码,使它大量的模块化.如软件解析器,优 ...

  10. python图片小爬虫

    import re import urllib import os def rename(name): name = name + '.jpg' return name def getHtml(url ...