前言

picoCTF 2022一共66道题,队友基本都解出来了,只能说师傅们tql!共有15道Cryptography题目,其中3道RSA题目,难点应该都在整数分解的算法,借Generate师傅的wp分析一波,靠谱!

题解

0x01 Very Smooth

Description:Forget safe primes… Here, we like to live life dangerously… >:)
看下代码:

#!/usr/bin/pythonfrom binascii import hexlify
from gmpy2 import *
import math
import os
import sysif sys.version_info < (3, 9):math.gcd = gcdmath.lcm = lcm_DEBUG = FalseFLAG  = open('flag.txt').read().strip()
FLAG  = mpz(hexlify(FLAG.encode()), 16)
SEED  = mpz(hexlify(os.urandom(32)).decode(), 16)
STATE = random_state(SEED)def get_prime(state, bits):return next_prime(mpz_urandomb(state, bits) | (1 << (bits - 1)))def get_smooth_prime(state, bits, smoothness=16):p = mpz(2)p_factors = [p]while p.bit_length() < bits - 2 * smoothness:factor = get_prime(state, smoothness)p_factors.append(factor)p *= factorbitcnt = (bits - p.bit_length()) // 2while True:prime1 = get_prime(state, bitcnt)prime2 = get_prime(state, bitcnt)tmpp = p * prime1 * prime2if tmpp.bit_length() < bits:bitcnt += 1continueif tmpp.bit_length() > bits:bitcnt -= 1continueif is_prime(tmpp + 1):p_factors.append(prime1)p_factors.append(prime2)p = tmpp + 1breakp_factors.sort()return (p, p_factors)e = 0x10001while True:p, p_factors = get_smooth_prime(STATE, 1024, 16)if len(p_factors) != len(set(p_factors)):continue# Smoothness should be different or some might encounter issues.q, q_factors = get_smooth_prime(STATE, 1024, 17)if len(q_factors) != len(set(q_factors)):continuefactors = p_factors + q_factorsif e not in factors:breakif _DEBUG:import syssys.stderr.write(f'p = {p.digits(16)}\n\n')sys.stderr.write(f'p_factors = [\n')for factor in p_factors:sys.stderr.write(f'    {factor.digits(16)},\n')sys.stderr.write(f']\n\n')sys.stderr.write(f'q = {q.digits(16)}\n\n')sys.stderr.write(f'q_factors = [\n')for factor in q_factors:sys.stderr.write(f'    {factor.digits(16)},\n')sys.stderr.write(f']\n\n')n = p * qm = math.lcm(p - 1, q - 1)
d = pow(e, -1, m)
c = pow(FLAG, e, n)print(f'n = {n.digits(16)}')
print(f'c = {c.digits(16)}')#n = e77c4035292375af4c45536b3b35c201daa5db099f90af0e87fedc480450873715cffd53fc8fe5db9ac9960867bd9881e2f0931ffe0cea4399b26107cc6d8d36ab1564c8b95775487100310f11c13c85234709644a1d8616768abe46a8909c932bc548e23c70ffc0091e2ed9a120fe549583b74d7263d94629346051154dad56f2693ad6e101be0e9644a84467121dab1b204dbf21fa39c9bd8583af4e5b7ebd9e02c862c43a426e0750242c30547be70115337ce86990f891f2ad3228feea9e3dcd1266950fa8861411981ce2eebb2901e428cfe81e87e415758bf245f66002c61060b2e1860382b2e6b5d7af0b4a350f0920e6d514eb9eac7f24a933c64a89
#c = 671028df2e2d255962dd8685d711e815cbea334115c30ea2005cf193a1b972e275c163de8cfb3d0145a453fec0b837802244ccde0faf832dc3422f56d6a384fbcb3bfd969188d6cd4e1ca5b8bc48beca966f309f52ff3fc3153cccaec90d8477fd24dfedc3d4ae492769a6afefbbf50108594f18963ab06ba82e955cafc54a978dd08971c6bf735b347ac92e50fe8e209c65f946f96bd0f0c909f34e90d67a4d12ebe61743b438ccdbcfdf3a566071ea495daf77e7650f73a7f4509b64b9af2dd8a9e33b6bd863b889a69f903ffef425ea52ba1a293645cbac48875c42220ec0b37051ecc91daaf492abe0aaaf561ffb0c2b093dcdabd7863b1929f0411891f5

代码很长,输出结果给了n和c,已知e=65537,利用factordb无法直接分解,根据题目提示Don’t look at me… Go ask Mr. Pollard if you need a hint!以及题目Very Smooth可以联想到Pollard’s p−1光滑数。
即当p是N的因数,且p−1光滑的时候,可以使用 Pollard’s p − 1 算法来分解 N。
NCTF2019-官方writeup中childRSA这题对这个算法讲的很清晰。
具体的python代码如下:

def Pollard(n):a=2while True:for i in range(2,80000):a=pow(a,i,n)for j in range(80000,104729+1):a=pow(a,j,n)if j % 15 ==0:d=GCD(a-1,n)if(1<d<n):return(d)a+=1

n成功分解后就是常规的RSA题了,一共跑了24秒,还是很快的,完整代码如下:

from Crypto.Util.number import *
import gmpy2
n = 'e77c4035292375af4c45536b3b35c201daa5db099f90af0e87fedc480450873715cffd53fc8fe5db9ac9960867bd9881e2f0931ffe0cea4399b26107cc6d8d36ab1564c8b95775487100310f11c13c85234709644a1d8616768abe46a8909c932bc548e23c70ffc0091e2ed9a120fe549583b74d7263d94629346051154dad56f2693ad6e101be0e9644a84467121dab1b204dbf21fa39c9bd8583af4e5b7ebd9e02c862c43a426e0750242c30547be70115337ce86990f891f2ad3228feea9e3dcd1266950fa8861411981ce2eebb2901e428cfe81e87e415758bf245f66002c61060b2e1860382b2e6b5d7af0b4a350f0920e6d514eb9eac7f24a933c64a89'
c = '671028df2e2d255962dd8685d711e815cbea334115c30ea2005cf193a1b972e275c163de8cfb3d0145a453fec0b837802244ccde0faf832dc3422f56d6a384fbcb3bfd969188d6cd4e1ca5b8bc48beca966f309f52ff3fc3153cccaec90d8477fd24dfedc3d4ae492769a6afefbbf50108594f18963ab06ba82e955cafc54a978dd08971c6bf735b347ac92e50fe8e209c65f946f96bd0f0c909f34e90d67a4d12ebe61743b438ccdbcfdf3a566071ea495daf77e7650f73a7f4509b64b9af2dd8a9e33b6bd863b889a69f903ffef425ea52ba1a293645cbac48875c42220ec0b37051ecc91daaf492abe0aaaf561ffb0c2b093dcdabd7863b1929f0411891f5'def Pollard(n):a=2while True:for i in range(2,80000):a=pow(a,i,n)for j in range(80000,104729+1):a=pow(a,j,n)if j % 15 ==0:d=GCD(a-1,n)if(1<d<n):return(d)a+=1
p=Pollard(int(n,16))
q=int(n,16)//p
d=gmpy2.invert(65537,(p-1)*(q-1))
m=pow(int(c,16),d,int(n,16))
print(long_to_bytes(m))
#picoCTF{94287e17}

0x02 Sum-O-Primes

Description:We have so much faith in RSA we give you not just the product of the primes, but their sum as well!
先看代码:

#!/usr/bin/pythonfrom binascii import hexlify
from gmpy2 import mpz_urandomb, next_prime, random_state
import math
import os
import sysif sys.version_info < (3, 9):import gmpy2math.gcd = gmpy2.gcdmath.lcm = gmpy2.lcmFLAG  = open('flag.txt').read().strip()
FLAG  = int(hexlify(FLAG.encode()), 16)
SEED  = int(hexlify(os.urandom(32)).decode(), 16)
STATE = random_state(SEED)def get_prime(bits):return next_prime(mpz_urandomb(STATE, bits) | (1 << (bits - 1)))p = get_prime(1024)
q = get_prime(1024)x = p + q
n = p * qe = 65537
m = math.lcm(p - 1, q - 1)
d = pow(e, -1, m)
c = pow(FLAG, e, n)
print(f'x = {x:x}')
print(f'n = {n:x}')
print(f'c = {c:x}')

题目给了x = p + q和n = p * q,已知phi = (p-1) * (q-1) = p * q - (p + q) +1直接就可以直接得到phi,再解rsa就可以了,完整代码:

from Crypto.Util.number import *
import gmpy2
x = '1b1fb4b96231fe1b723d008d0e7776169ee5d4a8e3573c12c37721cee5de1d882f040d1e3f543d36a574984ad95c1e79e02de14fa136b4be7f4468cbd62773f6a4fd06effc2b845ca07424100466bdfeee652d78b25a4273ba4e950e1a8ebfe256a2f8541fe2207c41f39c2363e23064bc56bed5cf563b8dba873da3c1320256e'
n ='b6b2353316c7b0a6c0ecae3bd7d2191eee519551f4ed86054e6380663668e595f6f43f867caa8feda217905643d73453f3797f6096c989fd099852239e5d73c753f909d8efd172d211a4ed4a966dbcbf56b9cbadd416de0a3472a253571b4e4f1bab847a407a27eb37449488f63aedb9f5ec72d9e331ab6154fe45c8cb4e2005d124d1ac8ecd588cd2280e215b078d8ea9da438bbcb1b155a339b91f39e3d17bab112436cdbb6d104fdeb0dce1ac41a1fe8fda0490ef3124794e0383565c299df24ad8a915669469c0b0dc604ed359afb3636d5f633362d8ef9fce7a42f64d5f1f4e50911a15459f97c1b11ee44af4e8bb636895cf75da105a8d1564160ba091'
c = '49e426aba3431d9bb73bfc5dd18115dcea3c78a9915e9cf65e060560015c951327f20fe5dd74bfecd9a00659d4f740e42f707e47d8f6b331d8ad1021de41e15f133cbe7c782f22168149df57a6c37095ba6877765a67d8478434a7a5eabb26097404ad464fa0388cacb97a26aaf3b83b6eb0fa73e16bc1de49b33ee64920118f8483feff3634541df97dadad88302392095059cbe56e7148453f16464da8be2b6ca4a6fc0052210f697975fd3c4f3f94bfa3bb2422124a6f0e9685f0440ed020294b6788d7ea3c002d86d86faced8e37b36673ea2b5c72726c66d1834d2dcafdf40220c41dfb3d1f07c5c0d236ce7af86b937476c5aabe33cae8d535713627de'
phi=int(n,16)-int(x,16)+1
d=gmpy2.invert(65537,phi)
m=pow(int(c,16),d,int(n,16))
print(long_to_bytes(m))
#picoCTF{126a94ab}

0x03 NSA Backdoor

Description:I heard someone has been sneakily installing backdoors in open-source implementations of Diffie-Hellman… I wonder who it could be…

Crypto日记之picoCTF 2022中的RSA题目求解相关推荐

  1. D-OJ刷题日记:找数组中的最大值 题目编号:702

    表中数据元素的数据类型为整型,假设数组中没有重复元素,找出数组中的最大值,并输出其下标和最大值. 输入描述 输入数组中元素的个数n,占一行 输入n个不相同的整数,以空格隔开,占一行 输出描述 输出最大 ...

  2. Crypto++库在VS 2005中的使用——RSA加解密

    Crypto++库在VS 2005中的使用--RSA加解密 源代码:下载 一.   下载Crypto++ Library Crypto++ Library的官方网:http://www.cryptop ...

  3. PL/SQL中的RSA加密

    目录 介绍 背景 使用代码 兴趣点 如何在Oracle 11g PL / SQL软件包(带有某些JAVA帮助器)中使用RSA公钥加密数据 介绍 最近,我需要使用提供的RSA公钥从Oracle PL / ...

  4. Crypto日记之DES-OFB加密模式的弱密钥问题

    0x01 前言 攻防世界上的一道题,考查DES加密OFB模式下的弱密钥问题.题目名为easy_BlockCipher. 0x02 解题 题目给了一段代码和一个ciphertext的二进制加密文件,先看 ...

  5. Maya 2022中的硬表面建模技术学习视频教程

    Maya 2022中的硬表面建模 信息: 使用正确的拓扑和边流在Maya中建模硬曲面对象. 你会学到什么 硬质表面工具和技术 细分工作流程 边缘流动控制 正确拓扑 材料设置 Studio Lightn ...

  6. [转帖]在SQL SERVER中实现RSA加密算法

    /*本次修改增加了unicode的支持,但是加密后依然显示为16进制数据,因为进行RSA加密后所得到的unicode编码是无法显示的,所以密文依然采用16进制数据显示. 需要特别注意:如果要对中文进行 ...

  7. cryptico.js java解密_從Cryptico.js中提取RSA私鑰

    我相信這是一個非常基本的問題,但我開始使用JavaScript和RSA進行研究,所以我有點失落.我剛剛下載了Cryptico庫,它爲我提供了一個易於使用的RSA密鑰生成/加密/解密.從Cryptico ...

  8. 在ASP.Net中实现RSA加密

    在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...

  9. 一张图片中的分离数据+十进制删改十六进制+连续base32和64编码+okk编码题目--rsa中求d题目

    目录 一张图片题目 题目rsa中求d 题目来源ctf杂项50 一张图片题目 1.图片用010打开后,发现这张图片数据过多,搜索到flag.zip压缩包文件可能需要分离文件 2.使用binwaik发现有 ...

最新文章

  1. Visual C++ Windows 用来定位 DLL 的搜索路径
  2. html行级元素和块级元素以及css转换
  3. 英语口语-文章朗读Week9 Wednesday
  4. python路径规划仿真实验_【python实战】批量获得路径规划——高德地图API
  5. linux watch
  6. Linux的用户和组群管理
  7. python fortran混编 ctypes_Python调用C/Fortran混合的动态链接库--上篇
  8. [Unity]限制一个值的大小(Clamp以及Mathf)
  9. 有的编译器,for (i=1; i 《 1; i++)会执行循环体
  10. 自己对行业未来发展的认知_我们正在建立的认知未来
  11. 日历算法学习总结——公历
  12. 链表的节点与指针 (重新理解)
  13. 整个AppData目录挪到D盘方法
  14. php 手机版 答题系统,基于ThinkPHP框架开发的驾考在线答题系统_WAP手机自适应界面+手机在线驾考宝典答题系统...
  15. MySQL学习笔记(2)
  16. 牛客网python版本多行输入输出
  17. 用nodejs实现httpserver服务
  18. exadata的infiniband交换机的ilom
  19. 如何在Android上玩经典复古游戏
  20. 单位的计算机云空间容量,计算机中容量单位B、KB、MB、GB和TB的关系

热门文章

  1. Subtext v2.0 定制化开发之上传文件File Upload管理
  2. 认识LTE平台(一):LTE的物理层
  3. VTK系列教程十一:MPR定位线
  4. Python案例1—人民币与美元的汇率兑换V_4.0
  5. Python 练习实例100例—4
  6. 互联网裁员浪潮下,我们该如何应对
  7. 针对美国国家安全局“酸狐狸”漏洞攻击武器平台的分析与应对方案建议
  8. 锁相环(PLL)基本原理
  9. 机器学习之模型融合(详解Stacking,Blending)
  10. 矩阵归一化的处理原理和方法