代码环境,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. luoguP1084 疫情控制(题解)(搜索+贪心)

    luoguP1084 疫情控制 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...

  2. springCloud的使用02-----服务消费者(rest+ribbon)

    1 将服务提供者做成集群模式 配置service-hi的端口为8762进行启动,配置service-hi的端口为8763进行启动, service-hi会在ecureka server上注册两个ser ...

  3. FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012951123/article/details/36871955 <span style= ...

  4. 在线px转换rem工具

    今天推荐一个在线工具,在线px转换rem工具 只要输入1rem = 多少px即可在线转换 和cssrem插件差不多的功能   rem在线转换工具: http://www.ofmonkey.com/fr ...

  5. NULL合并操作符??

    参考官方手册: /** * NULL合并操作符 ?? */ // $a, $b, $c都未声明和定义 var_dump($a??$b??$c); // NULL // $a为数组,$b为100,$c为 ...

  6. Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory

    执行下面的代码报错: $pdo = new PDO('mysql:dbname=db_test;host=localhost', 'root', '123456'); PHP Fatal error: ...

  7. MAC如何与linux服务器传递文件

    scp命令可以从本地拷贝文件到Linux服务器,也可以将Linux服务器文件下载到本地 将远程/root/articaleFetch/dist目录下文件和文件夹拷贝到dist文件夹 scp root@ ...

  8. tcpdump 与 抓包分析

    在Windows下一般使用WireShark 抓包软件,tcpdump 是 Linux 系统的抓包软件.它可以抓取 TCP/IP 协议族的数据包,支持针对网络层.协议.主机.端口的过滤,并提供 and ...

  9. 第二章 Kubernetes pod状态问题

    一.ImagePullBackOff 当我们创建一个名字为myapp的deployment的时候,它指向的是一个不存在的docker镜像: 最常见的有两个问题: (a)指定了错误的容器镜像 (b)使用 ...

  10. 某个应用的CPU使用率居然达到100%,我该怎么做?(三)

    某个应用的CPU使用率居然达到100%,我该怎么做?(三) 1. 引 你们好,可爱的小伙伴们^_^! 咱们最常用什么指标来描述系统的CPU性能呢?我想你的答案,可能不是平均负载,也不是CPU上下文切换 ...