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;…

Vue.js 中的登录状态管理:使用计算属性避免重复登录20240531

Vue.js 中的登录状态管理&#xff1a;使用计算属性避免重复登录 在前端开发中&#xff0c;用户的登录状态管理是一个非常常见的需求。我们希望用户在成功登录后&#xff0c;即使刷新页面&#xff0c;也能够保持登录状态&#xff0c;而不需要再次登录。在 Vue.js 中&#xff0c…

MySQL之创建高性能的索引(九)

创建高性能的索引 使用索引扫描来做排序 MySQL有两种方式可以生成有序的结果:通过排序操作&#xff1b;或者按索引顺序扫描(MySQL有两种排序算法)&#xff1b;如果EXPLAIN出来的type列的值为"index"&#xff0c;则说明使用了索引扫描来做排序(不要和Extra列的"…

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

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

排序题目:删除某些元素后的数组均值

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;删除某些元素后的数组均值 出处&#xff1a;1619. 删除某些元素后的数组均值 难度 2 级 题目描述 要求 给定一个整数数组 arr \texttt{arr} arr&…

文献阅读: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;我们都可以做出当前看来最好的选择&…

Python模块之Pandas(三)-- DataFrame 查看形状和部分数据

查看数据框的形状&#xff1a; import pandas as pd data pd.read_csv("D:/my_data/data1.csv")print(data的形状为:, data.shape) 查看数据前10行&#xff1a; data.head(10) #查看数据前10行 查看数据后10行&#xff1a; data.tail(10) 查看数据某几列/某几…

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

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

Unity中的Surface Effector 2D组件

Surface Effector 2D 是 Unity 中 2D 物理引擎提供的一个组件&#xff0c;用于影响与其接触的 2D 对象的运动。它可以对碰撞到其表面的物体施加速度和力&#xff0c;从而改变这些物体的运动行为。下面是一些关于 Surface Effector 2D 的关键点&#xff1a; 主要属性 Speed&am…

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

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

如何选择采购管理软件解决方案:推荐与指南

选择一款合适自身企业采购模式的管理软件对于企业来说至关重要。一款好的采购管理软件不仅能够提高采购效率&#xff0c;还能降低采购成本、优化库存管理、增强供应链的透明度和可控性。而在选择采购管理软件时&#xff0c;大家还需要考虑以下几个关键因素&#xff1a; 一、需…

代码随想录训练营Day56:Leetcode647、516

Leetcode647&#xff1a; 问题描述&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s &q…

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;在…

前端开发三大主流框架解析

Web前端三大主流框架分别是Angular、React和Vue.js。以下是《优联前端》关于这三个框架解析介绍&#xff1a; Angular&#xff1a; 来源与开发者&#xff1a;Angular是由Google开发的前端框架。功能特点&#xff1a;Angular是一个完整的框架&#xff0c;包括了数据绑定、组件化…