RSA密钥生成、加解密代码

背景介绍

在这里插入图片描述

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

由于学校作业的契机,写一一个关于RSA密钥生成、加解密的小代码,分享给大家一同学习。

其中运用了GUI交互库tkinter,这也是我第一次使用,感觉很有意思。希望在以后的日子里可以熟练掌握这个基本python库!

代码分享

import tkinter as tk
import math
from tkinter import messagebox
import randomclass RSAApp:#构造函数,初始化def __init__(self, root):self.root = rootself.root.title("RSA 加解密")self.main_menu()def main_menu(self):#主菜单self.clear_frame()tk.Label(self.root, text="主菜单").pack(pady=10)tk.Button(self.root, text="加密", command=self.encrypt_menu).pack(pady=5)tk.Button(self.root, text="解密", command=self.decrypt_menu).pack(pady=5)tk.Button(self.root, text="生成密钥", command=self.generate_keys_menu).pack(pady=5)def encrypt_menu(self):self.clear_frame()tk.Label(self.root, text="输入明文").pack(pady=5)self.plaintext_entry = tk.Entry(self.root, width=50)self.plaintext_entry.pack(pady=5)tk.Label(self.root, text="输入公钥 (e, n)").pack(pady=5)self.public_key_entry = tk.Entry(self.root, width=50)self.public_key_entry.pack(pady=5)tk.Button(self.root, text="加密", command=self.encrypt).pack(pady=5)tk.Button(self.root, text="返回", command=self.main_menu).pack(pady=5)def decrypt_menu(self):self.clear_frame()tk.Label(self.root, text="输入密文").pack(pady=5)self.ciphertext_entry = tk.Entry(self.root, width=50)self.ciphertext_entry.pack(pady=5)tk.Label(self.root, text="输入私钥 (d, n)").pack(pady=5)self.private_key_entry = tk.Entry(self.root, width=50)self.private_key_entry.pack(pady=5)tk.Button(self.root, text="解密", command=self.decrypt).pack(pady=5)tk.Button(self.root, text="返回", command=self.main_menu).pack(pady=5)def generate_keys_menu(self):self.clear_frame()tk.Label(self.root, text="生成的密钥对").pack(pady=5)tk.Label(self.root, text="公钥 (e, n)").pack(pady=5)self.public_key_text = tk.Text(self.root, height=5, width=50)self.public_key_text.pack(pady=5)tk.Label(self.root, text="私钥 (d, n)").pack(pady=5)self.private_key_text = tk.Text(self.root, height=5, width=50)self.private_key_text.pack(pady=5)tk.Button(self.root, text="生成密钥", command=self.generate_keys).pack(pady=5)tk.Button(self.root, text="返回", command=self.main_menu).pack(pady=5)def encrypt(self):try:plaintext = int(self.plaintext_entry.get())e, n = map(int, self.public_key_entry.get().split(','))ciphertext = pow(plaintext, e, n)messagebox.showinfo("加密结果", f"密文: {ciphertext}")except Exception as e:messagebox.showerror("错误", str(e))def decrypt(self):try:ciphertext = int(self.ciphertext_entry.get())d, n = map(int, self.private_key_entry.get().split(','))plaintext = pow(ciphertext, d, n)messagebox.showinfo("解密结果", f"明文: {plaintext}")except Exception as e:messagebox.showerror("错误", str(e))def generate_keys(self):p = self.generate_prime()#生成素数q = self.generate_prime()n = p * qphi = (p - 1) * (q - 1)e=random.choice([65557,65587,65609,65617,65629,65647,65651,65657,65677,65687,65701,65707,65713,65717,65719,65729,65731,65761,65777,65789])                  #公钥指数d = self.modinv(e, phi)self.public_key_text.delete(1.0, tk.END)self.private_key_text.delete(1.0, tk.END)self.public_key_text.insert(tk.END, f"{e}, {n}")self.private_key_text.insert(tk.END, f"{d}, {n}")def generate_prime(self):while True:num = random.randint(100, 999)if self.is_prime(num):return numdef is_prime(self, num):if num < 2:return Falsefor i in range(2, int(num ** 0.5) + 1):if num % i == 0:return Falsereturn Truedef modinv(self, a, m):# 扩展欧几里得算法求模逆m0, x0, x1 = m, 0, 1if m == 1:return 0while a > 1:q = a // mm, a = a % m, mx0, x1 = x1 - q * x0, x0if x1 < 0:x1 += m0return x1def clear_frame(self):for widget in self.root.winfo_children():widget.destroy()if __name__ == "__main__":root = tk.Tk()        #创建主窗口对象app = RSAApp(root)    #构造实例root.mainloop()

结果示范

密钥生成

在这里插入图片描述

加密

在这里插入图片描述
在这里插入图片描述

解密

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强化学习(一) 基本概念和赌博机问题

文章目录 什么是强化学习强化学习的两个基本特征强化学习的其它特征强化学习不同于有监督学习强化学习不同于无监督学习强化学习不同于进化方法强化学习的独特挑战强化学习典例 强化学习的要素强化学习的适用范围强化学习学术主线解决强化学习问题的一般框架赌博机两个影响因素…

SiT : Self-supervised vision Transformer

从NLP Transformer中借鉴而来的视觉 Transformer 在使用大规模监督数据或某种形式的协同监督&#xff08;例如教师网络&#xff09;进行预训练时已被证明是有效的。这些经过监督预训练的视觉Transformer在下游任务中通过最小的改动就能取得出色的结果。 随着监督预训练&#x…

告别盲目推广!Xinstall二维码携参技术,让App运营更精准高效

在移动互联网时代&#xff0c;App推广和运营已成为每个开发者必须面对的重要任务。然而&#xff0c;如何精准地定位目标用户&#xff0c;提高转化率和用户留存率&#xff0c;成为了摆在每个开发者面前的难题。今天&#xff0c;我们就来谈谈如何通过Xinstall二维码携参技术&…

AzSubEnum:针对Azure服务的子域名枚举查询工具

关于AzSubEnum AzSubEnum是一款专门为Azure服务量身定制的子域名枚举查询工具&#xff0c;该工具旨在帮助广大研究人员仔细搜索和识别与各种Azure服务相关的子域名信息。 通过结合查询技术和语句&#xff0c;AzSubEnum能够深入分析Azure的域名架构&#xff0c;并系统地探测和收…

Python使用trule库画小猪佩奇

在这篇博客中&#xff0c;我将向大家展示如何使用Python的Turtle模块来绘制一个可爱的小猪佩奇。这个项目不仅可以帮助你熟悉Turtle绘图&#xff0c;还可以让你在编程的过程中享受到绘画的乐趣。 并非百分百原创&#xff0c;有部分参考其他博主&#xff0c;请理性对待&#xff…

小学数学出题器-Word插件-大珩助手

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】小学数学出题器 1、实现了难度设定&#xff1b;…

怎么控制员工电脑的文件外发,六个控制文件外发的小窍门你必须了解

控制员工电脑的文件外发是企业信息安全管理中的重要环节&#xff0c;旨在防止敏感数据泄露、保护知识产权和维护商业秘密。 企业可以通过多种技术和管理措施相结合的方式来达到这一目的&#xff0c;确保既有效控制文件外发风险&#xff0c;又不影响正常的业务运作和员工工作效…

文献阅读:GCNG:用于从空间转录组数据推断基因相互作用的图卷积网络

文献介绍 「文献题目」 GCNG: graph convolutional networks for inferring gene interaction from spatial transcriptomics data 「研究团队」 Ziv Bar-Joseph&#xff08;美国卡内基梅隆大学&#xff09; 「发表时间」 2020-12-10 「发表期刊」 Genome Biology 「影响因子…

python 贪心算法(Greedy Algo)

贪婪是一种算法范式&#xff0c;它逐步构建解决方案&#xff0c;始终选择提供最明显和直接收益的下一个部分。贪婪算法用于解决优化问题。 如果问题具有以下属性&#xff0c;则可以使用贪心法解决优化问题&#xff1a; 每一步&#xff0c;我们都可以做出当前看来最好的选择&…

3d网渲100比本地渲染快吗?渲染100邀请码1a12

3D网渲是一种基于云计算的技术&#xff0c;它将渲染工作交由云端进行&#xff0c;以网渲平台渲染100为例&#xff0c;比起本地渲染&#xff0c;它有以下一些优势。 1、本地渲染受硬件限制&#xff0c;只能一台电脑渲染一张图&#xff0c;而渲染100有充足的服务器数量&#xf…

QT 音乐播放器【一】 显示音频级别指示器

文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了&#xff0c;就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针&#xff0c;用于监控音频流。当音频流被捕获或播放时&#xff0c;QAudioProbe 可以接收到音频数据。这个类在需要访问…

C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在…

计组雨课堂(5)知识点总结——备考期末复习(xju)

在汇编语言源程序中&#xff0c;“微指令语句"不是常见的组成部分&#xff0c;因为微指令通常是在硬件层面进行处理的&#xff0c;而不是在汇编语言层面。因此&#xff0c;不属于汇编语言源程序的是"微指令语句”。在汇编语言中&#xff0c;组成指令语句和伪指令语句…

直方图滤波、粒子滤波、卡尔曼滤波

三者都是基于贝叶斯滤波。 粒子滤波和直方图滤波不要求高斯分布&#xff0c;可解决非线性 卡尔曼滤波要求高斯分布且线性。扩展卡尔曼滤波为了解决非线性问题&#xff0c;利用泰勒展开进行一阶近似。 直方图滤波就是贝叶斯滤波的直观实现。自动驾驶定位算法-直方图滤波(Hist…

【Linux终端探险】:从入门到熟练,玩转基础命令的秘密(二)

文章目录 &#x1f680;Linux基础命令&#xff08;二&#xff09;&#x1f308;1. 寻找目录/文件命令⭐2. 创建文件命令&#x1f44a;3. 网络接口查询命令❤️4. 打包命令&#x1f4a5;5. 解压命令 上期回顾&#xff1a; &#x1f525;&#x1f525;&#x1f525;【Linux终端探…

19、matlab信号预处理中的中值滤波(medfilt1()函数)和萨维茨基-戈雷滤波滤(sgolayfilt()函数)

1、中值滤波&#xff1a;medfilt1()函数 说明&#xff1a;一维中值滤波 1&#xff09;语法 语法1&#xff1a;y medfilt1(x) 将输入向量x应用3阶一维中值滤波器。 语法2&#xff1a;y medfilt1(x,n) 将一个n阶一维中值滤波器应用于x。 语法3&#xff1a;y medfilt1(x,n…

2024年项目任务管理软件大盘点:12款值得一试的主流工具

12款优秀的项目任务管理软件&#xff1a;PingCode、Worktile、AIrTable、ClickUp、Teambition、Asana、Todoist、TAPD、Monday.com、Notion、Microsoft Project、Trello。 任务管理软件对于生活繁忙的人来说极为重要。它帮助用户有效跟踪他们需要完成的各项任务&#xff0c;包括…

牛客热题:没有重复数字的全排列

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;没有重复数字的全排列题目链接方…

LeetCode - 二分查找(Binary Search)算法集合(Python)[左右边界|旋转数组|双列表]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139419653 二分查找&#xff0c;也称为折半查找&#xff0c;是一种在有序数组中查找特定元素的高效算法。其基本原理是将待搜索的区间分成两半&am…

小猪APP分发:如何轻松进行在线封装APP

你是否曾经因为需要封装一个新版本的APP而感到头疼&#xff1f;传统的封装过程往往繁琐且耗时。但是&#xff0c;别担心&#xff0c;现在有了“小猪APP分发”&#xff0c;一切变得如此简单。 小猪APP分发www.appzhu.net是一个专门提供在线APP封装服务的平台。无论你是开发者还…