首页 > 其他分享 >Crypto学习笔记

Crypto学习笔记

时间:2024-04-30 23:23:23浏览次数:16  
标签:phi gmpy2 Crypto 笔记 解密 学习 import sympy

Crypto学习笔记(持续更新)

数学是个看天赋的学科,而我恰好没有这个天赋,别人很容易理解的内容,我需要学习很久。

本篇博客将记录我探索Crypto世界的点滴旅程,初衷是为了方便自己查阅,也便于自我成长与回顾,倘若笔者浅薄之见,能有幸为诸位师傅学问之海添一滴水,实乃蓬荜生辉,甚为喜悦。在此过程中,各位师傅如有任何观察到的疏漏或偏差,欢迎随时指正,先谢过各位师傅了。

二零二四年四月三十日记

2024第九届中国海洋大学信息安全竞赛-NeXT RSA(费马分解法,p、q相近)

题目描述:聪明的小军觉得既然都选择了随机的 p,那根据 p 选择 q,q 也是随机的辣!

import sympy
import libnum

flag="flag{" + "???" + "}"
m = libnum.s2n(flag)

p = sympy.randprime(1<<1024, 1<<1025)# 生成1024位到1025位之间的随机素数p
q = sympy.nextprime(p)# 找到大于p的下一个素数q

n = p*q
r = (p-1)*(q-1)
e = 65537

c = pow(m, e, n)

print(n, e, c)
# output:
#80044118049755180996754407858488943779355738585718372337839486032339412481191013051614126608584578841408197524632831442032118319629160505851518198448787590483634506563248531254421862061651099856312546562506221294620627871718678484548245902274972044599314097339549053518589561289734819710218838311181044519738709148493164321955860982700783886286661558574861608455547990794798848491695189544811325833194530596317989718866319530140199263278168146224240677087191093183415595617994125075880280632369616506148501757653260154487000183157405531772172082897743929126980157956142627803176227942226654177011633301413616266656761
#65537
#23280133104463252598665779150831148192014617461904564929071121215373331248942762386170411274023248423328388793808975632652896384007449549469345318875514363621903138122407682293848670093433946555776164835208375667498606187869211466397624286383057425296636315379314349307816391315242971306898487494604324473266965665471735612154916305882443496151118031672777088597821127499085632141307413890900246444539517971766135909771880642211582699957211983212981047822362311969553832913399476190919026666192056319334425636757404603336130688707109219644178606626422717046059209499394056295682594928581470210114322505904198054215544

其中 q 是 p 的下一个素数,这题可以使用费马分解法。

由于p,q直接相邻,则必有p < sqrt(n) < q 且p,q都是紧挨着sqrt(n) 的素数,用题目里的nextprime(sqrt(n)) 即可得q,进而解出密文。

解题脚本:

import gmpy2
import sympy
from Crypto.Util.number import *
 
n = 80044118049755180996754407858488943779355738585718372337839486032339412481191013051614126608584578841408197524632831442032118319629160505851518198448787590483634506563248531254421862061651099856312546562506221294620627871718678484548245902274972044599314097339549053518589561289734819710218838311181044519738709148493164321955860982700783886286661558574861608455547990794798848491695189544811325833194530596317989718866319530140199263278168146224240677087191093183415595617994125075880280632369616506148501757653260154487000183157405531772172082897743929126980157956142627803176227942226654177011633301413616266656761
c = 23280133104463252598665779150831148192014617461904564929071121215373331248942762386170411274023248423328388793808975632652896384007449549469345318875514363621903138122407682293848670093433946555776164835208375667498606187869211466397624286383057425296636315379314349307816391315242971306898487494604324473266965665471735612154916305882443496151118031672777088597821127499085632141307413890900246444539517971766135909771880642211582699957211983212981047822362311969553832913399476190919026666192056319334425636757404603336130688707109219644178606626422717046059209499394056295682594928581470210114322505904198054215544
e = 65537
n2=gmpy2.iroot(n,2)[0]
p=sympy.nextprime(n2)
q=n//p
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))

这段代码使用了几个Python库(gmpy2, sympy, Crypto.Util.number)来执行一个RSA加密信息的解密过程。

  1. 导入所需库:

    import gmpy2
    import sympy
    from Crypto.Util.number import *
    
    • gmpy2库用于高效的数学运算,特别是大数运算。
    • sympy库用于符号数学计算,这里主要用到了寻找下一个素数的功能。
    • Crypto.Util.number模块包含了处理大整数的工具。
  2. 定义密文、模数和公钥指数:

    n = ...  # 很长的整数,模数
    c = ...  # 密文
    e = 65537  # 公钥指数,常见的RSA公钥指数
    
  3. 计算n的平方根:

    n2=gmpy2.iroot(n,2)[0]
    

    这里尝试计算n的平方根,并取整数部分,用于后续步骤中的近似估计p或q的大小。

  4. 寻找p和q:

    p=sympy.nextprime(n2)
    q=n//p
    

    首先,使用sympy.nextprime(n2)找到大于n的平方根的下一个素数作为p的一个估计值。然后,通过n除以p得到q的近似值。这里的方法假设n是两个相近的素数的乘积,且通过近似方法找到这两个素数。

  5. 计算欧拉函数φ(n):

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

    计算模数n对应的欧拉函数φ(n),用于计算解密指数d。

  6. 计算解密指数d:

    d=gmpy2.invert(e,phi)
    

    利用扩展欧几里得算法计算d,使得(ed \equiv 1 \mod \phi(n))。

  7. 解密密文:

    m=pow(c,d,n)
    

    使用快速幂算法计算(c^d \mod n),得到原始明文的数值表示。

  8. 转换并打印解密结果:

    print(long_to_bytes(m))
    

    将解密得到的数值转换为字节串并打印出来,通常用于展示解密后的文本信息。

标签:phi,gmpy2,Crypto,笔记,解密,学习,import,sympy
From: https://www.cnblogs.com/xiaochange/p/18168865

相关文章

  • 8086 汇编学习 Part 5
    流程转移背景一般情况下指令是顺序地逐条执行的,而在实际中,常需要改变程序的执行流程。转移指令可以控制CPU执行内存中某处代码的指令。可以修改IP,或同时修改CS和IP的指令。分类按转移行为分类段内转移:只修改IP(例如JMPAX)段间转移:同时修改CS和IP(例......
  • jenkins学习转载文本
    基于Docker容器DevOps应用方案企业业务代码发布系统一、企业业务代码发布方式1.1传统方式以物理机或虚拟机为颗粒度部署部署环境比较复杂,需要有先进的自动化运维手段出现问题后重新部署成本大,一般采用集群方式部署部署后以静态方式展现1.2容器化方式以容器为颗粒度......
  • 高级软件工程笔记
    软件系统支撑软件(SupportSoftware):软件系统的中间层,支撑各种软件的开发、运行与维护的软件。系统软件(SystemSoftwareSystemSoftware):最靠近计算机硬件的最靠近计算机硬件的一层软件——控制和协调计算机及外部设备、支持应用软件开发与运行的软件。支撑软件(SupportSoftw......
  • 39.C语言数组学习的有关整理
    首先还是关于这两个东西sizeof()用于计算所占空间大小strlen()只用于求字符串长度/***sizeof计算所占空间大小\0也会计算*strlen只能用来求字符串长度直到找到字符串结束标志\0**/chararr1[]={'a','b','c'};//abcchararr2[]="abc";//abc\0......
  • 【pytorch学习】之多层感知机
    多层感知机1多层感知机最简单的深度网络称为多层感知机。多层感知机由多层神经元组成,每一层与它的上一层相连,从中接收输入;同时每一层也与它的下一层相连,影响当前层的神经元。当我们训练容量较大的模型时,我们面临着过拟合的风险。因此,将从基本的概念介绍开始讲起,包括过拟合、欠......
  • SQL SERVER 从入门到精通 第5版 第三篇 高级应用 第12章 游标的使用 读书笔记
     第十二章游标的使用>.游标的概述游标是一种数据库对象,用于在SQL中处理(SELECT的)查询结果集。它允许逐行地访问查询结果集的数据,以进行一系列操作,如更新、删除或插入数据。游标通常用于存储过程或触发器中,用于对数据进行逐行处理。通过游标,可以实现对结果集的逐行处......
  • Django 笔记 - 特殊操作符
    Django是目前最流行的PythonWeb开源框架。相对于Python 日常编程,Django有一些特殊用法的操作符,这里简称为特殊操作符。下面简要介绍两种特殊操作符,即':'和'|'。操作符':' 在URL中,使用操作符‘:'表示带有命名空间的URL。例如,使用'admin:index'表示......
  • 软件设计师基础学习 四
    四、数据库技术基础4.1数据库基本概念4.1.1数据库系统数据:是数据库中存储的基本对象,是描述事务的符号记录数据库DB:是长期存储在计算机内、有组织的、可共享的大量数据的集合数据库的基本特征:数据按照一定的数据模型组织、描述和存储可为各种用户共享冗余度较小......
  • Fast Walsh Transform 学习笔记 | FWT
    本文中使用\(\cap\)表示按位与,用\(\cup\)表示按位或Part1.与/或卷积First.问题引入给定长度为\(2^n\)的数列\(A,B\),求\(C_i=\sum_{j\cupk=i}A_j\timesB_k\)显然有\(O(4^n)\)的暴力Second.变换这一部分可以参考快速莫比乌斯变换中的Zeta变换,即......
  • 学习 C++,从搭建 Visual Studio Code 开始
    0.声明本文针对Windows和Linux系统配置VisualStudioCode,Mac贵族请勿入内。本文以Windows10系统演示。1.准备工作1.1.安装VisualStudioCodeWindows:官网下载链接选择Windows(Windows10,11)进行安装Linux:在应用商店搜索VisualStudioCode,安装即......