代码环境,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. vue - blog开发学习5

    基本功能和后台联调 1.首页的所有博客 因为是前后台都是本地开发,所以前端vue需要设置proxy:修改/config/index.js中的这个proxyTable proxyTable: { '/a ...

  2. ubuntu16.04安装LNMP(ubuntu+Nginx+mysql+PHP7.0)

    系统环境: Ubuntu 16.04.2 LTS nginx version: nginx/1.10.3 (Ubuntu) PHP 7.0.22-0ubuntu0.16.04.1 mysql  Ver ...

  3. 小程序中为什么使用var that=this

    前言: 在小程序或者js开发中,经常需要使用var that = this;开始我以为是无用功,(原谅我的无知),后来从面向对象的角度一想就明白了,下面简单解释一下我自己的理解,欢迎指正批评. 代码示 ...

  4. spring 事物(二)—— 编程式事物实现与扩展

    简介 使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务.这些步骤都由模板完成.但出现异常时,应通过TransactionStatus 的setRollback ...

  5. java环境--JDK和Tomcat在linux上的安装和配置

    Tomcat在Linux上的安装与配置 以下使用的Linux版本为: Redhat Enterprise Linux 7.0 x86_64,Tomcat版本为tomcat-7.0.54.1.下载JDK ...

  6. 在eclipse中添加svn插件

    1.点击菜单栏中的help选项,然后选择Install New Software,然后点击ADD,输入: name:subclipse     url:http://subclipse.tigris. ...

  7. Java多线程的理解和实例

    编写具有多线程程序经常会用到的方法:run(), start(), wait(), notify(), notifyAll(), sleep(), yield(), join() 还有一个关键字:sy ...

  8. 有趣的taskset命令,使进程再指定CPU上运行

    前言 taskset命令,用于进程的CPU调优,可以把某进程,指定再某CPU内工作. 如还不明白,可以参考此文 http://www.361way.com/linux-context-switch/5 ...

  9. python中map的排序以及取出map中取最大最小值

    map排序: 1.按key排序: items=dict.items() items.sort() sorted(dict.items(),key=lambda x:x[0],reverse=False ...

  10. 【多线程】无锁编程以及CAS

    无锁编程 / lock-free / 非阻塞同步 无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Sy ...