从零开始学RSA加密解密过程

news2024/10/6 1:46:13

因为文字太过晦涩难懂,下面以图示的方法来理解RSA加密解密的过程

 

 

以上过程中因为HACK无法得到p,q信息,也就是无法计算出d , 导致了无法解密 c 得到 m

(n,e) 公钥

(d,n) 私钥

(p,q,n,e) 生成的加密必要信息

必要的公式

c ≡ me mod n -----------> (信息加密) m ≡ cd mod n -----------> (信息解密) ϕ(n) = (p−1)∗(q−1) ----------> (n的欧拉函数) d∗e ≡ 1 mod ϕ(n) ----------> (计算e关于ϕ(n)的逆元)

A 要 向 B 传递信息 m

首先 B  要把  公钥 (n, e)传递给  A

然后  A 拿着公钥  进行 公钥加密算法  将 明文 m  变成 密文 c

接着  A 把 生成的 密文 c  传递 给 B

最后  B 再利用 私钥 (n,d)进行 私钥解密算法 还原出来  明文 m

rsa加密的过程

随便找出两个 整数 q 和 p (q,p互素,即:公因数只有1)

求出n = q * p  

φ(n)= (p-1)*(q-1) 欧拉公式

公钥 e :   随机取,要求 :e 和 φ(n) 互素(公因数只有 1);   1<  e < φ(n));

私钥 d :  ed  ≡  1 (mod  φ(n) )   (ed 除以 φ(n) 的 余数 为  1 )

N:大整数N,我们称之为模数(modulus)

p 和 q :大整数N的两个因子(factor)

e 和 d:互为模反数的两个指数(exponent)

c 和 m:分别是密文和明文

而{N,e}称为公钥,{N,d}称为私钥。总的来说,明文m(一般为flag)就像是一个锁,而私钥{N,d}就是打开这个锁的钥匙。我们要做的就是根据公钥{N,e}来生成这把钥匙来打开锁。而私钥{N,d}中的N又是可以从公钥{N,e}中获得的,所以关键就是在d的获取,d的值和p,q,e有关。p,q又是N的两个因子,所以RSA题目关键便是对N的分解,分解出N的两个因子题目便解决了。这便是RSA题目的思路。

1 已知 p ,q,e   求 d?

p= 18255878996579787209

q= 324206965464727676218470615969477348407

e= 13

import gmpy2

p= 18255878996579787209

q= 324206965464727676218470615969477348407

e= 13

phi_n= (p - 1) * (q - 1)

d = gmpy2.invert(e, phi_n)

print("d is:")

print (d)

将获取的d,进行md5加密:d3ba43fb7bbe17d17aa7054a7ed3ac23,得到的结果即为flag。

2 已知 公钥(n, e) 和 密文 c  求 明文 m?

方法一:(n,e不太大的情况下)

首先将  n 用 yafu分解为 q 和 p

再利用脚本 :

import libnum

from Crypto.Util.number import long_to_bytes



c = 0x6cd55a2bbb49dfd2831e34b76cb5bdfad34418a4be96180b618581e9b6319f86

n = 108539847268573990275234024354672437246525085076605516960320005722741589898641

#n = int("",16)

e = 65537

#e = int("",16)

q = 333360321402603178263879595968004169219

p = 325593180411801742356727264127253758939



d = libnum.invmod(e, (p - 1) * (q - 1))

m = pow(c, d, n)   # m 的十进制形式

string = long_to_bytes(m)  # m明文

print(string)  # 结果为 b‘ m ’ 的形式

方法二:(n , e 比较大的时候)

在一个题目中,你拿到了两个n,e都为65537,两个n分别为:

n1=9051013965404084482870087864821455535159008696042953021965631089095795348830954383127323853272528967729311045179605407693592665683311660581204886571146327720288455874927281128121117323579691204792399913106627543274457036172455814805715668293705603675386878220947722186914112990452722174363713630297685159669328951520891938403452797650685849523658191947411429068829734053745180460758604283051344339641429819373112365211739216160420494167071996438506850526168389386850499796102003625404245645796271690310748804327

n2=13225948396179603816062046418717214792668512413625091569997524364243995991961018894150059207824093837420451375240550310050209398964506318518991620142575926623780411532257230701985821629425722030608722035570690474171259238153947095310303522831971664666067542649034461621725656234869005501293423975184701929729170077280251436216167293058560030089006140224375425679571181787206982712477261432579537981278055755344573767076951793312062480275004564657590263719816033564139497109942073701755011873153205366238585665743

通过直接分解,上factordb都分解失败。通过尝试发现:

print gcd(n1,n2)

打印出:

1564859779720039565508870182569324208117555667917997801104862601098933699462849007879184203051278194180664616470669559575370868384820368930104560074538872199213236203822337186927275879139590248731148622362880471439310489228147093224418374555428793546002109

则此致即为两个n共有的素因子p,然后进一步求出q,求解完毕。

def gcd(a, b):

   if a < b:

     a, b = b, a

   while b != 0:

     temp = a % b

     a = b

     b = temp

   return a

n1=9051013965404084482870087864821455535159008696042953021965631089095795348830954383127323853272528967729311045179605407693592665683311660581204886571146327720288455874927281128121117323579691204792399913106627543274457036172455814805715668293705603675386878220947722186914112990452722174363713630297685159669328951520891938403452797650685849523658191947411429068829734053745180460758604283051344339641429819373112365211739216160420494167071996438506850526168389386850499796102003625404245645796271690310748804327

n2=13225948396179603816062046418717214792668512413625091569997524364243995991961018894150059207824093837420451375240550310050209398964506318518991620142575926623780411532257230701985821629425722030608722035570690474171259238153947095310303522831971664666067542649034461621725656234869005501293423975184701929729170077280251436216167293058560030089006140224375425679571181787206982712477261432579537981278055755344573767076951793312062480275004564657590263719816033564139497109942073701755011873153205366238585665743

print gcd(n1,n2)

p=1564859779720039565508870182569324208117555667917997801104862601098933699462849007879184203051278194180664616470669559575370868384820368930104560074538872199213236203822337186927275879139590248731148622362880471439310489228147093224418374555428793546002109

q=n1/p

print(q)

 

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

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

相关文章

单片机家电产品学习记录--IO推挽输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 单片机家电产品–IO推挽输出 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1 单片机IO口科普&#xff1a;推挽输出、开漏输出详解 推挽输出既可以输出低…

Android 性能优化之黑科技开道(一)

1. 缘起 在开发电视版智家 App9.0 项目的时候&#xff0c;发现了一个性能问题。电视系统原本剩余的可用资源就少&#xff0c;而随着 9.0 功能的进一步增多&#xff0c;特别是门铃、门锁、多路视频同屏监控后等功能的增加&#xff0c;开始出现了卡顿情况。 经过调研分析发现有…

OpenHarmony实战:Makefile方式组织编译的库移植

以yxml库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取yxml源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述yxml/bench/benchmark相关代码yxml/test/测试输入输出文件&#xff0c;及测试脚本yxml/Makefile编译组织文件yxml/.gitat…

C语言:文件操作(一)

目录 前言 1、为什么使用文件 2、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 结&#xff08;一&#xff09; 前言 本篇文章将介绍C语言的文件操作&#xff0c;在后面的内容讲到&#xff1a;为什么使用文…

2024-04-03 NO.4 Quest3 手势追踪抓取物体

文章目录 1 手势抓取方式1.1 Hand Grab1.2 Touch Hand Grab1.3 Distance Hand Grab 2 HandGrabExamples 示例场景2.1 Interactor 对象2.2 Interactable 对象2.2.1 父子结构2.2.2 “Hand Grab lnteractable” 脚本2.2.3 “Move Towards Target Provider” 脚本2.2.4 其他 Moveme…

OpenHarmony实战:CMake方式组织编译的库移植

以double-conversion库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取double-conversion源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述double-conversion/cmake/CMake组织编译使用到的模板double-conversion/double-conversion/源…

浅谈分布式光伏电站的运维管理

摘要&#xff1a;随着近些年我国对节能降耗关注力度的持续加大&#xff0c;为满足人们不断增长的电能需求&#xff0c;光伏发电产业得到迅猛发展&#xff0c;其中分布式光伏发电的比重持续增长。在打赢脱贫攻坚战的大背景下&#xff0c;国家电网公司探索出一条“阳光扶贫”的扶…

第十三届蓝桥杯JavaA组省赛真题 - 青蛙过河

解题思路&#xff1a; 定义一个累和数组arr&#xff0c;我们可以比较arr[ i ]和arr[ l ]之间的差值看是否大于等于2倍的x&#xff0c;满足则证明这两点之间可以跳满所有实际过河次数&#xff0c;此时记录最大距离&#xff0c;并移动左边界 l import java.util.Scanner;public…

大数据时代下,如何利用信息化、数字化、数智化成为行业领先者

在大数据时代背景下&#xff0c;企业的竞争力提升离不开信息化、数字化和数智化的联动作用。首先&#xff0c;企业需通过信息化手段&#xff0c;将业务流程、管理方式等进行标准化和系统化&#xff0c;提高效率和减少错误。同时&#xff0c;借助数字化技术如云计算、物联网等&a…

抖店体验分是什么?怎么快速提升体验分?今天一篇带你搞懂!

大家好&#xff0c;我是电商小布。 经营小店的小伙伴应该都有发现&#xff0c;当自己的店铺成功出够30单之后&#xff0c;小店就会出现体验分这个东西。 简单来说&#xff0c;这个就相当于是对我们店铺的一个综合评价&#xff0c;包括有商品、物流、服务三个方面。 这个分数…

前端作业之完成学校官方网页的制作

&#xff08;未使用框架&#xff0c;纯html和css制作&#xff09; 注&#xff1a;由本人技术限制&#xff0c;代码复用性极差 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>xxx大学</tit…

java框架学习——注解/元注解概述及使用案例

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 注解 注解&#xff08;Annotation&#xff09;是java代码里的特殊标记。作用为&#xff1a;让其他程序根据注解信息来决定怎么执行该程序&#xff0c;如&#xff1a;Override,Test等。同时可以根…

换到idf 5.0版本后报错 jsmn could not be found

原因&#xff1a; idf5.0去掉了部分组件&#xff0c;包括jsmn&#xff0c;工程中adf又用到了这个组件&#xff0c;所以会报错。 解决办法&#xff1a; 升级adf到新版本即可。

从C到C++过渡知识 中(为什么C++支持函数重载,而C不支持函数重载)

感谢大家的阅读&#xff0c;这篇文章我们接着了解C对于C的一些优化。 函数重载 了解C这个特殊用法之前&#xff0c;我们先考虑一个问题&#xff0c;如何交换两个整数。相信大家一定信手捏来&#xff0c;实参传地址而非变量&#xff0c;于是可以写出如下函数。 void Swap(int*…

无极低码:免费版部署操作指南

无极低码 :https://wheart.cn 无极低码:免费试用版部署过程参照: 无极低码部署版操作指南 https://wheart.cn/so/home?m=index&id=ad614930-d936-11ee-8489-525400be6368 ” 。 下载完解压成后进行部署

Codeforces Round 837 (Div. 2) C. Hossam and Trainees

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; const int N sqrt(1…

硬件RAID横评(上)

正文共&#xff1a;3857字 50图&#xff0c;预估阅读时间&#xff1a;12 分钟 之前误打误撞测试了软件RAID&#xff08;Windows下软RAID测试&#xff09;&#xff0c;发现性能基本上是线性的&#xff0c;而据说硬件RAID性能比这个高的很。那本文将就硬件RAID展开测试&#xff0…

【leetcode】 c++ 数字全排列, test ok

1. 问题 2. 思路 3. 代码实现 #if 0 class Solution { private:vector<int> path; // 满足条件的一个结果 vector<vector<int>> res; // 结果集 void backtracking(vector<int> nums, vector<bool> used){// 若path的个数和nums个数相等,说明…

C++中的vector与C语言中的数组的区别

C中的vector和C语言中的数组在很多方面都有所不同&#xff0c;以下是它们之间的一些主要区别&#xff1a; 大小可变性&#xff1a; vector是C标准模板库&#xff08;STL&#xff09;提供的动态数组容器&#xff0c;它的大小可以动态增长或减少。这意味着你可以在运行时添加或删…

JavaScript高级 —— 学习(三)

目录 一、深入面向对象 &#xff08;一&#xff09;面向对象介绍 &#xff08;二&#xff09;面向对象编程 &#xff08;oop&#xff09; 1.面向对象编程介绍 2.面向对象编程优点 3.面向对象的特征 4.和面向过程编程对比 二、构造函数 &#xff08;一&#xff09;介绍…