代码环境,python3.5.2

RSA加密的过程是:使用公钥加密,私钥解密

RSA签名的过程是:使用私钥签名,公钥验证

所以核心代码就是,生成公钥私钥,使用公钥私钥分别进行加密解密。

在实际编码的时候,使用python自带的RSA库,需要特别处理编码问题,因为默认的加密解密函数是接收bytes类型的数据。

加密的核心代码如下:

# -*- coding: utf-8 -*-
import rsa
import base64
(public_key, private_key) = rsa.newkeys(1024)
msg = "M2Crypto python关于RSA的库还是蛮多的,当然也可以直接用openSSLqweasasd123"
msg = msg.encode(encoding="utf-8")
encrypt_msg = rsa.encrypt(msg, public_key) decrypt_msg = rsa.decrypt(encrypt_msg, private_key)
print("公钥:")
print(public_key.save_pkcs1().decode('utf8'))
print("\n私钥:")
print(private_key.save_pkcs1().decode('utf8'))
print("\n原始文本:")
print(msg.decode('utf8'))
print("\n加密后的文本:")
print(base64.encodebytes( encrypt_msg).decode('utf8'))
print("\n解密后的文本:")
print(decrypt_msg.decode('utf8'))

输出结果如下:

结合tkinter的代码如下,使用tkinter是因为绘制界面很简单:

# -*- coding:utf-8 -*-
from tkinter import *
import rsa
import base64 def GenerateKey():
(public_key, private_key) = rsa.newkeys(1024)
print("\n生成公钥:"+public_key.save_pkcs1().decode('utf8'))
print("\n生成私钥:"+private_key.save_pkcs1().decode('utf8'))
publicKeyText.delete(0.0, END)
publicKeyText.insert(END, public_key.save_pkcs1().decode('utf8')) privateKeyText.delete(0.0, END)
privateKeyText.insert(END, private_key.save_pkcs1().decode('utf8')) def EncryptionByPublickey(): #用公钥加密
public_key_str = publicKeyText.get("0.0", "end").encode(encoding="utf-8")
public_key = rsa.PublicKey.load_pkcs1(public_key_str) entry_str = entryText.get("0.0", "end").encode(encoding="utf-8") encrypt_msg = rsa.encrypt(entry_str, public_key)
print("公钥加密后的文本为:\n"+base64.encodebytes(encrypt_msg).decode('utf8'))
outputText.delete(0.0, END)
outputText.insert(END, base64.encodebytes(encrypt_msg).decode('utf8')) def EncryptionByPrivatekey():
private_key_str = privateKeyText.get("0.0", "end").encode(encoding="utf-8")
private_key = rsa.PrivateKey.load_pkcs1(private_key_str) entry_str = entryText.get("0.0", "end").encode(encoding="utf-8") encrypt_msg = rsa.encrypt(entry_str, private_key)
print("私钥加密后的文本为:\n"+base64.encodebytes(encrypt_msg).decode('utf8'))
outputText.delete(0.0, END)
outputText.insert(END, base64.encodebytes(encrypt_msg).decode('utf8')) def DeryptionByPublickey():
public_key_str = privateKeyText.get("0.0", "end").encode(encoding="utf-8")
public_key = rsa.PrivateKey.load_pkcs1(public_key_str) entry_str = entryText.get("0.0", "end").encode(encoding="utf-8")
encrypt_msg = base64.decodebytes( entry_str)
outputText.delete(0.0, END) try:
decrypt_msg = rsa.decrypt(encrypt_msg, public_key)
print("公钥解密后的文本为:\n"+decrypt_msg.decode('utf8'))
outputText.insert(END,decrypt_msg.decode('utf8'))
except:
decrypt_msg = "公钥解密失败"
print(decrypt_msg)
outputText.insert(END,decrypt_msg)
def DecryptionByPrivatekey():
private_key_str = privateKeyText.get("0.0", "end").encode(encoding="utf-8")
private_key = rsa.PrivateKey.load_pkcs1(private_key_str) entry_str = entryText.get("0.0", "end").encode(encoding="utf-8")
encrypt_msg = base64.decodebytes( entry_str)
outputText.delete(0.0, END) try:
decrypt_msg = rsa.decrypt(encrypt_msg, private_key)
print("私钥解密后的文本为:\n"+decrypt_msg.decode('utf8'))
outputText.insert(END,decrypt_msg.decode('utf8'))
except:
decrypt_msg = "私钥解密失败"
print(decrypt_msg)
outputText.insert(END,decrypt_msg) window = Tk()
window.title("RSA加密解密软件") frame = Frame(window)
frame.pack() label = Label(frame, text = "公钥:")
label.grid(row = 1, column = 1,columnspan= 4) publicKeyText = Text(frame,width=50,height=8)
publicKeyText.grid(row = 2, column = 1,columnspan = 4) label = Label(frame, text = "私钥:")
label.grid(row = 3, column = 1,columnspan= 4) privateKeyText = Text(frame,width=50,height=12)
privateKeyText.grid(row = 4, column = 1,columnspan = 4) btGenerateKey = Button(frame, text = "生成公钥/私钥",command=GenerateKey)
btGenerateKey.grid(row = 5, column = 1,columnspan = 4) label = Label(frame, text = "请输入加密/解密的文本:")
label.grid(row = 6, column = 1,columnspan = 4) entryText = Text(frame,width=50,height=5)
entryText.grid(row = 7, column = 1,columnspan = 4) btEncryptionByPublickey = Button(frame, text = "公钥加密",command=EncryptionByPublickey)
btEncryptionByPublickey.grid(row = 8, column = 1,pady = 10) btDeryptionByPublickey = Button(frame, text = "公钥解密",command=DeryptionByPublickey)
btDeryptionByPublickey.grid(row = 8, column = 2) btEncryptionByPrivatekey = Button(frame, text = "私钥加密",command=EncryptionByPrivatekey)
btEncryptionByPrivatekey.grid(row = 8, column = 3) btDecryptionByPrivatekey = Button(frame, text = "私钥解密",command=DecryptionByPrivatekey)
btDecryptionByPrivatekey.grid(row = 8, column = 4) outputText = Text(frame,width=50,height=5)
outputText.grid(row = 9, column = 1,columnspan = 4) print("欢迎使用本软件……")
GenerateKey();
mainloop() print("欢迎再次使用本软件……")

加密过程:

  使用公钥加密:

  使用私钥解密:

数字签名过程:

  使用私钥签名:

  使用公钥验证:

python tkinter 实现 带界面(GUI)的RSA加密、签名的更多相关文章

  1. 150+行Python代码实现带界面的数独游戏

    150行代码实现图形化数独游戏 Github地址,欢迎各位大佬们fork.star啥的,感谢: 今天闲着没事干,以前做过html+js版的数独,这次做个python版本的,界面由pygame完成,数独 ...

  2. python使用tkinter写带界面的工具

    python一般用来写纯脚本的居多,但也可以做有视图的产品出来,例如做网页和客户端工具.做成工具的好处是,让不懂代码的人也能使用,不需要去修改代码里面的参数,如果使用次数频繁,甚至比纯脚本跟节约时间: ...

  3. 【Python】 用户图形界面GUI wxpython I 基本用法和组件

    wxpython - 基本用法和组件 wxpython是python对跨平台GUI库wxWidgets的封装.wxWidgets是由C++写成的. wxpython被包装进了wx模块中,用它设计GUI ...

  4. python——Tkinter图形化界面及threading多线程

    Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macinto ...

  5. 【Python】 用户图形界面GUI wxpython IV 菜单&对话框

    更多组件 ■ 菜单栏 Menu 菜单是很多GUI必不可少的一部分.要建立菜单,必须先创建菜单栏: menuBar = MenuBar() menu = Menu() item1 = menu.Appe ...

  6. 【Python】 用户图形界面GUI wxpython III 更多组件

    wxpython - 更多组件 我写到的这些组件可能一来不是很详细,二来不是最全的,想要更好地用这些组件,应该还是去看看教程和别的示例.比较简单的,推荐http://download.csdn.net ...

  7. 【Python】 用户图形界面GUI wxpython II 布局和事件

    wxpython - 布局和事件 这章主要记录布局器Sizer以及事件的用法. // 目前还需要记录的:Sizer的Add方法加空白,Sizer的Layout,Sizer的Remove如何有效 ■ 布 ...

  8. Python开发【模块】:M2Crypto RSA加密、解密

    M2Crypto 模块 快速安装: # 环境centos7.0,提前装好openssl(自行百度安装),windows装不上,暂不考虑了 [root@localhost ~]# pip install ...

  9. JAVA RSA私钥 加密(签名) 对应 C# RSA私钥 加密(签名)

    非对称密钥RSA算法加解密在C#和Java之间交互的问题,这两天看了很多其他人写的文章,碰到了几个问题,最终解决问题. 参考地址:http://xw-z1985.iteye.com/blog/1837 ...

随机推荐

  1. python学习笔记--类(一)

    # 类是为了代码重用 class First: #类 pass #实例 = 类名() obj = First() # 类是一种产生实例的工厂# 类和模块的差异在于,内存中特定的模块只有一个实例(所以我 ...

  2. 前端学习(三十一)canvas(笔记)

    canvas             画布    画图.做动画.做游戏===========================================    canvas就是新标签 必须获取绘图 ...

  3. JavaSE---Object

    1.概述 Object常用方法: 1.1 getClass(): public final native Class<?> getClass(); 返回   该对象   运行时的Class ...

  4. 什么是http协议(二)

    一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. ...

  5. c++ fork进程与同步锁

    首先定义在多进程环境中的锁,采用读写锁,即可以同时读,但只能单独写. 头文件processLock.h #ifndef PROCESSLOCK_H #define PROCESSLOCK_H #inc ...

  6. UNP学习第四章tcp

    一.TCP简单流程图 因为对于server我已经写过一篇笔记了:http://www.cnblogs.com/ch122633/p/8315883.html 所以我想再补充一些对于client的部分的 ...

  7. apache的tomcat负载均衡和集群配置 "

    略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务 ...

  8. 自动化测试之CSS定位

    之前做自动化测试一直用RF框架来操作,发现了明显与unittest的灵活性相差一点. 重新温习了unittest框架,其中这个框架,元素定位是难点,以前更多的使用JQUERY方式定位, 发现其实与CS ...

  9. linux 安装memcache

    cd /usr/local/src  #进入软件包存放目录wget http://pecl.php.net/get/memcache-2.2.6.tgz  #下载tar zxvf memcache-2 ...

  10. Blazor 组件库 Blazui 开发第一弹【安装入门】

    标签: Blazor Blazui文档 Blazui 传送门 Blazor 组件库 Blazui 开发第一弹[安装入门]https://www.cnblogs.com/wzxinchen/p/1209 ...