【密码学】RSA破解方法汇总(PYTHON实现)

源自于密码学的一次大作业~

RSA破解

💡 Alice使用的RSA密码体制,有以下事项需要说明:

1) 模数𝑁=𝑝𝑞规模为1024比特,其中𝑝,𝑞为素数;

2)每次加密最多8个明文字符;

3) 明文超过8个字符时,对明文分片,每个分片不超过8个字符;

4) 分片明文填充为512比特消息后再进行加密,填充规则为高位添加64比特标志位,随后加上32比特通信序号,再添加若干个0,最后64比特为明文分片字符对应的ASCII码(注:填充方式参见加密案例,但注意每次通信的标志位可能变化);

5)分片加密后发送一个加密帧数据,帧数据文件名称为FrameXX,其中XX表示接收序号,该序号不一定等于通信序号;

6) 帧数据的数据格式如下,其中数据都是16进制表示,结构如下

1024bit模数N|1024bit加密指数e|1024bit密文。

7) 由于Alice初次使用该软件,可能会重复发送某一明文分片。

请您尝试恢复每个帧数据的p和q,以及明文M


输入:若干帧文件

文件的格式: 1024bit模数 N | 1024bit加密指数 e | 1024bit密文


一、低指数攻击——中国剩余定理

题目

💡 给定五个密文,存在五个文件中,这5个密文(都是16进制)是同一明文m用RSA算法模不同N得到的,加密指数e=5(即公钥为5),每个密文的格式: 1024bit模数 N | 1024bit加密指数 e | 1024bit密文。请利用中国剩余定理恢复明文m (求解5个同余方程的同余方程组)

from mpmath import mp
import gmpy2
import functoolsdef chinese_remainder_theorem(n, a):# n 是模数列表,a 是同余方程组的余数列表# 求模数的积N = functools.reduce(gmpy2.mul, n)  # 使用 functools.reduce 计算乘积# 求每个模数 Ni 和 Ni 在模数 n 中的商 si 和余数 tix = 0for ni, ai in zip(n, a):si = N // niti = gmpy2.invert(si, ni)xi = gmpy2.mul(gmpy2.mul(si, ti), ai)  # 分别计算 si * ti 和结果再与 ai 相乘x = gmpy2.add(x, xi)# 将 x 转化为模数为 N 的余数,作为最小非负整数解return x % N# 示例输入
a = []
n = []
f=[]
f.append(r'file1')
f.append(r'file2')
f.append(r'file3')
f.append(r'file4')
f.append(r'file5')for file_path in f:# 读取数据with open(file_path, 'r') as f:data = f.read().strip()# 解析数据hex_length = len(data) // 3N = int(data[:hex_length], 16)e = int(data[hex_length:2*hex_length], 16)ct = int(data[2*hex_length:], 16)# 打印数据# print(f"Modulus N: {N}\\n")# print(f"Public exponent e: {e}\\n")# print(f"Ciphertext: {ct}\\n")n.append(N)a.append(ct)
mp.dps=1000
nn = [gmpy2.mpz(i) for i in n]  # 模数列表
aa = [gmpy2.mpz(i) for i in a]  # 同余方程组的余数列表
m = chinese_remainder_theorem(n, a)
res,exa=gmpy2.iroot(gmpy2.mpz(m),5)def parse_8_pairs_16_bytes(s):# 将字符串截取为最后 16 个字节bytes_16 = s[-16:]# 定义一个空列表,用于保存解析出的字符对pairs = []# 分组解析每两个字节for i in range(0, 16, 2):byte1, byte2 = bytes_16[i], bytes_16[i + 1]char1 = chr(int(byte1 + byte2, 16))pairs.append((char1,))# 将所有字符对连接起来,并返回字符串return ''.join(char for pair in pairs for char in pair)
print(hex(res))
print(parse_8_pairs_16_bytes(hex(res)))

二、费马分解

摘自 RSA-p和q挨得很近(费马分解)_rsa费马分解_爱码蔡蔡子的博客-CSDN博客


1.p,q为邻居素数

p,q是两个素数,而且他俩在素数序列里面就是一前一后的关系。所以我们要把他俩的乘积开根号得到的结果一定是在p,q之间的一个数字,(而且一定不是素数,因为p,q就是紧邻的两个素数)。那我们找这个开方出来的数字的下一个素数,一定是q,因此我们再让n/q就可以得到两个素数

示例:

'''生成两个挨得近的素数p,q'''
p = getPrime(512)
q = gmpy2.next_prime(p)
n=p*q
print(p)
print(q)
print(n)'''开始破解'''
# gmpy2的iroot函数,这个函数专门用来进行大数开根号,gmpy2.iroot(n,t)。
# n是大整数,t是幂次。
temp=gmpy2.iroot(n,2)[0]  
p=gmpy2.next_prime(temp)
q=n//p
print(p)
print(q)

2.平方差遍历法

令a是n的"中间值"sqrt(n),然后让a以步长为1自增遍历,直到pow(a,2)-n的结果可以正好开方为止。那个结果开方就是b。

$$ p=a-b;q=a+b;n=pq=a^2-b^2 $$

$$ b^2=a^2-n $$

因此,可以令a的初始值为sqrt(n),不断增大a直至满足上述条件即可

示例:

'''生成两个挨得近的素数p,q'''
p = getPrime(512)
q = gmpy2.next_prime(p)
n=p*q
print(p)
print(q)
print(n)print('开始破解')
'''开始破解'''
a=gmpy2.iroot(n,2)[0]
while 1:   #破解出来一组就行了,一般也就一组,挨得很近的话很快就出来了,如果长时间还没出来就可以换方法了,不要指望着他遍历所有的,到死也弄不完。B2=pow(a,2)-na+=1if gmpy2.is_square(B2):b=gmpy2.iroot(B2,2)[0]p=a+bq=a-bprint(p)print(q)break

题目

💡 给定密文的格式: 1024bit模数 N | 1024bit加密指数 e | 1024bit密文。已知密文产生的RSA算法中的pq很接近


import gmpy2
import gmpy2def fermat_factorization(n):a = gmpy2.isqrt(n) + 1  # 取 n 的平方根并向上取整b2 = a * a - nwhile not gmpy2.is_square(b2):# 迭代计算直到 b2 是一个完全平方数a += 1b2 = a * a - np = a + gmpy2.isqrt(b2)q = a - gmpy2.isqrt(b2)return p, q
f=[]
f.append(r'file1')
f.append(r'file2')for file_path in f:# 读取数据with open(file_path, 'r') as f:data = f.read().strip()# 解析数据hex_length = len(data) // 3n = gmpy2.mpz(int(data[:hex_length], 16))e = int(data[hex_length:2*hex_length], 16)ct = int(data[2*hex_length:], 16)# # 打印数据# print(f"================================\\nModulus N: {n}\\n")# print(f"Public exponent e: {e}\\n")# print(f"Ciphertext: {ct}\\n")# input()p, q = fermat_factorization(n)if p is None or q is None:print("无法分解质因数")else:print("质因数分解结果:")print("p =", p)print("q =", q)d=gmpy2.invert(e,(q-1)*(p-1))m=gmpy2.powmod(ct,d,n)def parse_8_pairs_16_bytes(s):# 将字符串截取为最后 16 个字节bytes_16 = s[-16:]# 定义一个空列表,用于保存解析出的字符对pairs = []# 分组解析每两个字节for i in range(0, 16, 2):byte1, byte2 = bytes_16[i], bytes_16[i + 1]char1 = chr(int(byte1 + byte2, 16))pairs.append((char1,))# 将所有字符对连接起来,并返回字符串return ''.join(char for pair in pairs for char in pair)print(hex(m))print(parse_8_pairs_16_bytes(hex(m)))

三、共模攻击

【密码学RSA】共模攻击原理详解_已知e1*e2的共模攻击题_rsa共模攻击原理-CSDN博客

RSA共模攻击(包括原理)-CSDN博客

💡 共模是指:就是明文m,相同。用两个公钥e1,e2加密得到两个私钥d1,d2 和两个密文c1,c2

共模攻击,即当m不变的情况下,知道n,e1,e2,c1,c2, 可以在不知道d1,d2的情况下,解出m

利用条件为=> gcd(e1,e2)=1

def hack(n, c1, c2, e1, e2):def egcd(a, b):if b == 0:return a, 0else:x, y = egcd(b, a % b)return y, x - (a // b) * ys = egcd(e1, e2)s1 = s[0]s2 = s[1]# 求模反元素if s1 < 0:s1 = - s1c1 = invert(c1, n)elif s2 < 0:s2 = - s2c2 = invert(c2, n)m = pow(c1, s1, n) * pow(c2, s2, n) % nreturn m

from gmpy2 import invert
def hack(n, c1, c2, e1, e2):def egcd(a, b):if b == 0:return a, 0else:x, y = egcd(b, a % b)return y, x - (a // b) * ys = egcd(e1, e2)s1 = s[0]s2 = s[1]# 求模反元素if s1 < 0:s1 = - s1c1 = invert(c1, n)elif s2 < 0:s2 = - s2c2 = invert(c2, n)m = pow(c1, s1, n) * pow(c2, s2, n) % nreturn mf1=r'file1'
f2=r'file2'# 读取数据
with open(f1, 'r') as f:data = f.read().strip()
# 解析数据
hex_length = len(data) // 3
n1 = int(data[:hex_length], 16)
e1 = int(data[hex_length:2*hex_length], 16)
c1 = int(data[2*hex_length:], 16)
f.close()# 读取数据
with open(f2, 'r') as f:data = f.read().strip()
# 解析数据
hex_length = len(data) // 3
n2 = int(data[:hex_length], 16)
e2 = int(data[hex_length:2*hex_length], 16)
c2 = int(data[2*hex_length:], 16)
f.close()if n1==n2:m=hack(n1,c1,c2,e1,e2)
# print("m={}".format(hex(m)))
def parse_8_pairs_16_bytes(s):# 将字符串截取为最后 16 个字节bytes_16 = s[-16:]# 定义一个空列表,用于保存解析出的字符对pairs = []# 分组解析每两个字节for i in range(0, 16, 2):byte1, byte2 = bytes_16[i], bytes_16[i + 1]char1 = chr(int(byte1 + byte2, 16))pairs.append((char1,))# 将所有字符对连接起来,并返回字符串return ''.join(char for pair in pairs for char in pair)
print(hex(m))
print(parse_8_pairs_16_bytes(hex(m)))

四、rho、rho p-1分解pq

【快速因数分解】Pollard's Rho 算法 - Koshkaaa (cnblogs.com)

import gmpy2
from gmpy2 import mpz
import random
import time# Rho算法
def rho(n, timeout=3):if n % 2 == 0:return 2start_time = time.time()while True:if time.time() - start_time > timeout:  # 超时处理,替换判环return Nonex, y, c, d = random.randint(1, n-1), random.randint(1, n-1), random.randint(1, n-1), 1f = lambda x: (x * x + c) % nwhile d == 1:x = f(x)y = f(f(y))d = gmpy2.gcd(abs(x-y), n)if d != n:return df=[]
f.append(r'file1')
f.append(r'file2')for file_path in f:# 读取数据with open(file_path, 'r') as f:data = f.read().strip()# 解析数据hex_length = len(data) // 3n = int(data[:hex_length], 16)e = int(data[hex_length:2*hex_length], 16)ct = int(data[2*hex_length:], 16)p = rho(n)while p is None:  # 超时,重新选择随机数p = rho(n)q=n//pd=gmpy2.invert(e,(q-1)*(p-1))m=gmpy2.powmod(ct,d,n)def parse_8_pairs_16_bytes(s):# 将字符串截取为最后 16 个字节bytes_16 = s[-16:]# 定义一个空列表,用于保存解析出的字符对pairs = []# 分组解析每两个字节for i in range(0, 16, 2):byte1, byte2 = bytes_16[i], bytes_16[i + 1]char1 = chr(int(byte1 + byte2, 16))pairs.append((char1,))# 将所有字符对连接起来,并返回字符串return ''.join(char for pair in pairs for char in pair)print(hex(m))print(parse_8_pairs_16_bytes(hex(m)))
# rho p-1
import math
import random
import time
import gmpy2def rho_pminus1(n, B, timeout=10):a = 2start_time = time.time()# 计算 a^q-1for q in range(2, B+1):if (time.time() - start_time) > timeout:  # 超时处理,替换判环return Nonea = pow(a, q, n)# 计算 a^q-1 和 n 的最大公约数d = math.gcd(a - 1, n)if d > 1 and d < n:return dreturn Nonedef factorize_large_number(n, B, timeout=10):factors = []while n > 1:p = rho_pminus1(n, B, timeout)if p is None:factors.append(n)  # 无法找到质因数,将n作为一个质因数breakelse:factors.append(p)n //= preturn factors# 指数的范围B和超时时间
B = 100000
timeout = 10# 读取数据
with open(r'file1', 'r') as f:data = f.read().strip()# 解析数据
hex_length = len(data) // 3
n = int(data[:hex_length], 16)
e = int(data[hex_length:2*hex_length], 16)
ct = int(data[2*hex_length:], 16)# 分解非常大的数
factors = factorize_large_number(n, B, timeout)p,q=factors
d=gmpy2.invert(e,(q-1)*(p-1))
m=gmpy2.powmod(ct,d,n)
def parse_8_pairs_16_bytes(s):# 将字符串截取为最后 16 个字节bytes_16 = s[-16:]# 定义一个空列表,用于保存解析出的字符对pairs = []# 分组解析每两个字节for i in range(0, 16, 2):byte1, byte2 = bytes_16[i], bytes_16[i + 1]char1 = chr(int(byte1 + byte2, 16))pairs.append((char1,))# 将所有字符对连接起来,并返回字符串return ''.join(char for pair in pairs for char in pair)
print(hex(m))
print(parse_8_pairs_16_bytes(hex(m)))

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

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

相关文章

Java项目学生管理系统六后端补充

班级管理 1 班级列表&#xff1a;后端 编写JavaBean【已有】编写Mapper【已有】编写Service编写controller 编写Service 接口 package com.czxy.service;import com.czxy.domain.Classes;import java.util.List;/*** author 桐叔* email liangtongitcast.cn* description*/ p…

【Jenkins】Centos环境安装Jenkins(通过rpm安装)

在Centos操作系统中通过rpm安装Jenkins 参考官网 https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 1、下载安装Jdk17 下载安装 # 更新您的系统&#xff0c;不一定需要 # sudo yum -y update # 安装将用于下载 Java 17 二进制文件的 wget 命令行工具。 s…

计算机网络传输层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 传输层的功能端口UDP协议UDP数据报UDP的首部格式UDP校验 TCP协议&#xff08;必考&#xff09;TCP报文段TCP连接的建立TCP连接的释放TCP的可靠传输TCP的流量控制零窗口探测报文段 TCP的拥塞控制慢开始和拥塞控制快重传和快恢复 TCP和U…

薅github的羊毛-用pages建自己的博客或静态资源站 - 1/2

注册帐号 准备邮箱注册帐号&#xff0c;在注册界面输入用户名、邮箱及密码完成注册。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 1. 在注册成过程中&#xff0c;会往邮箱发送验证码&#xff0c;请如实填写即可 2. 验证码没错的话&#xff0c;就代…

AUTOSAR从入门到精通-面向服务的中间件SOME/IP(一)

目录 前言 几个相关概念 几个高频面试题目 SOME/IP 与 CAN 的不同? 通信速度

JavaScript询问gpt:如何合并数组?

如何合并数组&#xff1f; 在 JavaScript 中&#xff0c;你可以使用多种方法来合并数组。以下是一些常见的方法&#xff1a; 1. 使用 concat() 方法&#xff1a; javascript const array1 [1, 2, 3]; const array2 [4, 5, 6]; const mergedArray array1.concat(…

【Maven】加载 Maven 项目报错 status code: 501, reason phrase: HTTPS Required (501)

问题描述 加载 Maven 项目报错&#xff0c;错误信息如下&#xff1a; status code: 501, reason phrase: HTTPS Required (501)尝试使用 -U 标记(强制更新快照)运行 Maven 导入原因分析 这个错误通常表示 Maven 在尝试从远程仓库下载依赖时遇到了 HTTPS 必需的错误。 解决方…

案例:xpath实例+功能

素材&#xff1a;test.html 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Title</title></head><body><span>我爱你</span><ul><li…

Mac配置环境变量不生效

Mac配置环境变量不生效 Mac中的环境变量介绍 Mac系统的环境变量&#xff0c;加载顺序为&#xff1a; /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc 当然/etc/profile和/etc/paths是系统级别的&#xff0c;系统启动就会加载&#xff0c;后面…

将自己的django项目部署到云服务器(腾讯云centos)

最近自己买了个云服务玩&#xff0c;突然就想把自己写的小项目部署到云服务器上&#xff0c;这样就可以实现公网访问了。以下是整个部署过程和遇到的各种问题的解决方案&#xff0c;有想自己部署自己功能的&#xff0c;可以参考着进行哦。 1、设置好腾讯云的远程登录代码 先给…

HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础

前言&#xff1a; 通过前面ArkTS开发语言&#xff08;上&#xff09;之TypeScript入门以及ArkTS开发语言&#xff08;中&#xff09;之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进&#xff0c;知道了ArkTS具备了声明式语法和组件化特性&#xff0c;今天&#xff0c;搭…

倾角仪(xyz)理解

第一列是初始值 x更小&#xff0c;说明往左倾 x更大&#xff0c;说明往右倾 z更大、y更大&#xff0c;说明往后倾 z更小、y更大&#xff0c;说明往前倾

[Unity+文心知识库]使用百度智能云搭建私有知识库,集成知识库API,打造具备知识库的AI二次元姐姐

1.简述 最近从百度智能云的官方技术支持那边了解到&#xff0c;目前百度千帆大模型平台提供有在线的知识库功能&#xff0c;能够在线上传自己的私人知识库文档&#xff0c;并且配置文心一言模型作为文本生成的引擎&#xff0c;构建自己的私有知识库。之前自己搭建知识库都是用的…

VPN 在网络安全中的应用

虚拟专用网络&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;是指利用不安全的公共网络如 Internet 等作为传输媒介&#xff0c;通过一系列的安全技术处理&#xff0c;实现类似专用网络的安全性能&#xff0c;保证重要信息的安全传输的一种网络技术。 1&#…

【网络安全技术】电子邮件安全PGP,SMIME

一、PGP&#xff08;Pretty Good Privacy&#xff09; PGP是一种邮件加密手段&#xff0c;他在发邮件一方加密&#xff0c;然后发给发送方邮件服务器&#xff0c;发送方邮件服务器再发送给接收方邮件服务器&#xff0c;然后接收方再从接收方邮件服务器pop出来&#xff0c;这整…

【Python爬虫】Python爬虫入门教程注意事项

1 引言 随着互联网的快速发展&#xff0c;网络数据已经成为人们获取信息的重要来源。而爬虫技术作为获取网络数据的重要手段&#xff0c;越来越受到人们的关注。在众多编程语言中&#xff0c;Python因其易学易用、库丰富、社区活跃等优势&#xff0c;成为爬虫开发的首选。本文将…

python和pygame实现烟花特效

python和pygame实现烟花特效 新年来临之际&#xff0c;来一个欢庆新年烟花祝贺&#xff0c;需要安装使用第三方库pygame&#xff0c;关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 效果图及源码 先看效果图&#xff1a…

共建开源新里程:北京航空航天大学OpenHarmony技术俱乐部正式揭牌成立

12月11日,由OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会(以下简称“TSC”)和北京航空航天大学共同举办的“OpenHarmony软件工程研讨会暨北京航空航天大学OpenHarmony技术俱乐部成立仪式”在京圆满落幕。 现场大合影 活动当天,多位重量级嘉宾出席了此次…

PostgreSQL DBA之数据库指标监控

常规监控 连接数使用超过95%告警&#xff0c;最大连接数和当前连接数 select (select count(*) from pg_stat_activity) /(select setting from pg_settings where name max_connections) ::numeric >0.95; 存在空闲连接idle in transaction大于5秒的连&#xff0c;如果长…

【EXCEL】vlookup,index/match查找函数

区别&#xff1a; 1.Vlookup函数只能查找列数据&#xff0c;即纵向查找&#xff0c;而IndexMatch函数&#xff0c;既可以纵向查找&#xff0c;也可以横向查找&#xff1b; 2、Vlookup函数查找的依据(第一个参数)必须位于数据源的第一列&#xff0c;IndexMatch函数组合则无此限制…