[ACTF新生赛2020]crypto-rsa0

破解ZIP伪加密与RSA基础题
本文介绍了解决ZIP伪加密的方法,并提供了一个简单的RSA基础题实例及其解题脚本。通过使用Winhex工具修改特定字节,可以破解ZIP文件的伪加密状态。接着,利用Python脚本对给定的RSA参数进行解密,揭示隐藏的FLAG。

题目:

       在下载完压缩包后,打开我们可以看到以上东西,其中,我们打开hint: 怎么办呢,出题人也太坏了,竟然把压缩包给伪加密了!

       接下来我们尝试打开challenge时发现提示我们有密码,在hint中已经提醒我们本题采用了伪加密。

概念:

ZIP伪加密 ,一个ZIP文件由三个部分组成:

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志。 

伪加密原理:zip伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩

包。 一般来说,文件各个区域开头就是50 4B,然后后面两个字节是版本,再后面两个就是判断

是否有加密的关键了。
 

关于伪加密可以去大致了解一下:(2条消息) 压缩包伪加密原理_每天都要努力哇的博客-CSDN博客_压缩包伪加密

解决方法是打开Winhex,遇到504B0304,把其的第3、4个byte改成0000,遇到504B0102,把其的第5、6个byte改成0000即可破解伪加密。

在改完后,我们便可以打开zip文件,看到赛题:

 

9018588066434206377240277162476739271386240173088676526295315163990968347022922841299128274551482926490908399237153883494964743436193853978459947060210411
7547005673877738257835729760037765213340036696350766324229143613179932145122130685778504062410137043635958208805698698169847293520149572605026492751740223
50996206925961019415256003394743594106061473865032792073035954925875056079762626648452348856255575840166640519334862690063949316515750256545937498213476286637455803452890781264446030732369871044870359838568618176586206041055000297981733272816089806014400846392307742065559331874972274844992047849472203390350
from Cryptodome.Util.number import *
import random

FLAG=#hidden, please solve it
flag=int.from_bytes(FLAG,byteorder = 'big')


p=getPrime(512)
q=getPrime(512)

print(p)
print(q)
N=p*q
e=65537
enc = pow(flag,e,N)
print (enc)

本题为一道简单的rsa基础题,写出脚本即可:

import binascii
import gmpy2
import binascii

p=9018588066434206377240277162476739271386240173088676526295315163990968347022922841299128274551482926490908399237153883494964743436193853978459947060210411
q=7547005673877738257835729760037765213340036696350766324229143613179932145122130685778504062410137043635958208805698698169847293520149572605026492751740223
c=50996206925961019415256003394743594106061473865032792073035954925875056079762626648452348856255575840166640519334862690063949316515750256545937498213476286637455803452890781264446030732369871044870359838568618176586206041055000297981733272816089806014400846392307742065559331874972274844992047849472203390350
e=65537

n=p*q
phi_n=(q-1)*(p-1)
d=gmpy2.invert(e,phi_n)
m=gmpy2.powmod(c,d,n)

print(binascii.unhexlify(hex(m)[10:]))

#b'{n0w_y0u_see_RSA}'

 

### 关于2020 ACTF 新生 crypto-aes 的解题报告 #### 题目背景与目标 题目旨在考察参者对于AES加密算法的理解以及实际应用能力。通过给出一段经过特定方式处理后的密文和部分提示信息,要求选手能够逆向工程并还原原始明文。 #### 加密过程解析 在给定的Python脚本中可以看到,程序首先生成了一个随机长度为32字节(即两个16字节块)的秘密钥`key`[^2]: ```python key = os.urandom(2)*16 ``` 接着创建了一个初始化向量`iv`,同样也是由操作系统提供的安全随机数构成,大小固定为16字节: ```python iv = os.urandom(16) ``` 随后计算了`key`与`iv`之间按位异或的结果,并将其转换成整型数值输出作为公开线索之一: ```python print(bytes_to_long(key)^bytes_to_long(iv)) ``` 最后利用上述参数实例化了一个AES对象,在CBC模式下完成了对标志字符串`FLAG`的加密操作,并打印出了最终得到的密文形式: ```python aes = AES.new(key, AES.MODE_CBC, iv) enc_flag = aes.encrypt(FLAG) print(enc_flag) ``` #### 解密方法探讨 为了成功破解这道挑战题,需要根据已知条件反推出正确的解密流程。观察到官方发布的解答代码片段可以发现,这里采用了不同的策略来恢复原本用于加密封印的数据结构[^3]: - **提取密钥**: 由于之前已经公布了`key ^ iv`的形式,因此可以通过简单的数学运算重新获得完整的`key`值; ```python out = bytes_to_long(out) # 将公布的long类型数据转回bytearray key = out[:16]*2 # 构建完整的32-byte key ``` - **重建IV**: 同样基于相同的逻辑关系,可以从现有的材料里推导出最初的`iv`; ```python iv = (bytes_to_long(out[16:]) ^ bytes_to_long(key[16:])) iv = long_to_bytes(iv) ``` 完成以上准备工作之后,则可以直接调用标准库函数执行常规意义上的AES-CBC解码动作即可获取隐藏的信息内容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值