第四届“百越杯” Crypto-RSA详解---解pem和enc文本

本文详细介绍了使用openssl解析RSA公钥,并通过分解大质数找到私钥的过程。利用Python脚本实现了从加密文件中恢复原始数据,展示了如何解决复杂的RSA加密问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解压文件包发现三个文件,flag.enc、pubkey.pem和rsa.py个文件。

一、看到.pem先用openssl解开公钥n和e

在xshell输入命令行:

openssl rsa -bubin -text -modulus -in warmup -in pubkey.pem

看到e和n了吗!!!

先把十六进制的n转换成十进制的n,如下:

e=9850747023606211927

于是我们得到n=62078208638445817213739226854534031566665495569130972218813975279479576033261

对于rsa看到n啥也别想,先把p和q分解出来

use-http://www.factordb.com  to decomposition factor

q=184333227921154992916659782580114145999

p=336771668019607304680919844592337860739

然后根据提供的rsa.py编写解密脚本:

#!/usr/bin/env python2.7
from gmpy import *
from Crypto.Util.number import getPrime
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from base64 import b64decode

flag_encode=b64decode(open('flag.enc','r').read())
pub=RSA.importKey(open('pubkey.pem','r').read())
n=pub.n
e=pub.e
q=184333227921154992916659782580114145999
p=336771668019607304680919844592337860739
i=1
while 1:
        print i
        i+=1
        n=q*p
        if n >= int(flag_encode.encode('hex'),16):
                fn=(p-1)*(q-1)
                d=invert(e,fn)
                prikey=RSA.construct((int(n),int(e),int(d)))
                key=PKCS1_v1_5.new(prikey)
                dec=key.decrypt(flag_encode,None)
                break
        else:
                p=next_prime(p**2+q**2)
                q=next_prime(2*q*p)
                e=next_prime(e**2)

print dec

然后丢去xshell得到:

<think>好的,我现在需要帮助用户学习如何使用Python或C/C++实现AES-128RSA-3072的加密与解密。首先,我得仔细分析用户的问题,看看他们具体需要什么。用户提到了AES-128RSA-3072,这两种加密算法分别是对称非对称加密的典型代表。根据用户提供的引用,特别是引用[2][3],他们可能已经有一些基础,但需要具体的代码示例教程。 首先,我应该确定用户的使用场景。AES-128适用于需要高效加密大量数据的场景,比如文件加密或网络传输;而RSA-3072则更适合密钥交换或数字签名,因为非对称加密处理速度较慢,不适合大数据量。接下来,我需要考虑如何用PythonC/C++分别实现这两种加密。 对于Python部分,引用[2]提到需要使用pycryptodome库。我需要确保代码示例正确安装该库,并且展示AESRSA的基本用法。在AES部分,需要注意生成密钥、使用CBC模式、填充方式以及初始向量(IV)的处理。对于RSA,需要生成密钥对,演示加密解密过程,尤其是处理长文本时的分段加密,因为RSA有长度限制。 在C/C++方面,引用[1][3]提到了OpenSSL库的使用。用户可能需要安装OpenSSL并链接到他们的项目中。这里需要展示如何生成RSA密钥,进行加密解密,以及AES的加密流程。需要注意的是,C/C++的代码可能更复杂,涉及更多的内存管理错误处理,所以示例代码应尽量简洁,同时提醒用户注意资源释放安全问题。 用户可能遇到的常见问题包括依赖库的安装、密钥管理、模式选择(如AES的CBC或GCM模式)、填充方式以及错误处理。在回答中应该预见到这些问题,并在代码注释或释中提到,比如提醒用户安装正确的库,使用适当的填充,处理加密数据的分块等。 此外,需要确保代码示例符合安全最佳实践。例如,AES中使用随机生成的IV,并安全地存储传输;RSA中使用OAEP填充以提高安全性。同时,要指出在实际应用中应使用更安全的密钥存储交换机制,避免硬编码密钥。 最后,生成相关问题部分需要考虑用户可能进一步的需求,比如性能优化、错误处理、不同模式的区别以及密钥管理策略。这些问题可以帮助用户深化理,并决实际开发中可能遇到的挑战。 总结一下,我需要分步骤提供PythonC/C++的实现示例,涵盖AESRSA的加解密过程,强调安全注意事项,并预见到用户可能遇到的问题,确保回答清晰、实用且准确。</think>### AES-128RSA-3072加解密实现指南 #### 一、Python实现 ##### 1. 环境准备 ```bash pip install pycryptodome ``` ##### 2. AES-128加解密实现 ```python from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes # 加密 def aes_encrypt(data: bytes, key: bytes) -> tuple: iv = get_random_bytes(16) # 初始向量 cipher = AES.new(key, AES.MODE_CBC, iv) ciphertext = cipher.encrypt(pad(data, AES.block_size)) return (iv, ciphertext) # 解密 def aes_decrypt(iv: bytes, ciphertext: bytes, key: bytes) -> bytes: cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size) return plaintext # 使用示例 key = get_random_bytes(16) # AES-128密钥长度16字节 data = b"Secret Message" iv, encrypted = aes_encrypt(data, key) decrypted = aes_decrypt(iv, encrypted, key) ``` ##### 3. RSA-3072加解密实现 ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP # 生成密钥对 key = RSA.generate(3072) private_key = key.export_key() public_key = key.publickey().export_key() # 加密(使用公钥) def rsa_encrypt(data: bytes, pub_key: bytes) -> bytes: recipient_key = RSA.import_key(pub_key) cipher = PKCS1_OAEP.new(recipient_key) return cipher.encrypt(data) # 解密(使用私钥) def rsa_decrypt(ciphertext: bytes, priv_key: bytes) -> bytes: key = RSA.import_key(priv_key) cipher = PKCS1_OAEP.new(key) return cipher.decrypt(ciphertext) # 使用示例 message = b"Confidential Data" encrypted_msg = rsa_encrypt(message, public_key) decrypted_msg = rsa_decrypt(encrypted_msg, private_key) ``` #### 二、C/C++实现(OpenSSL) ##### 1. 环境准备 ```bash # Ubuntu安装命令 sudo apt-get install libssl-dev ``` ##### 2. AES-128实现 ```c #include <openssl/aes.h> void aes_encrypt(const unsigned char* plaintext, int len, unsigned char* ciphertext, const unsigned char* key, unsigned char* iv) { AES_KEY aes_key; AES_set_encrypt_key(key, 128, &aes_key); AES_cbc_encrypt(plaintext, ciphertext, len, &aes_key, iv, AES_ENCRYPT); } void aes_decrypt(const unsigned char* ciphertext, int len, unsigned char* plaintext, const unsigned char* key, unsigned char* iv) { AES_KEY aes_key; AES_set_decrypt_key(key, 128, &aes_key); AES_cbc_encrypt(ciphertext, plaintext, len, &aes_key, iv, AES_DECRYPT); } ``` ##### 3. RSA-3072实现 ```c #include <openssl/rsa.h> #include <openssl/pem.h> RSA* generate_rsa_key() { RSA* rsa = RSA_new(); BIGNUM* bn = BN_new(); BN_set_word(bn, RSA_F4); RSA_generate_key_ex(rsa, 3072, bn, NULL); BN_free(bn); return rsa; } int rsa_encrypt(RSA* pub_key, const char* msg, unsigned char* enc_msg) { return RSA_public_encrypt(strlen(msg)+1, (unsigned char*)msg, enc_msg, pub_key, RSA_PKCS1_OAEP_PADDING); } int rsa_decrypt(RSA* priv_key, const unsigned char* enc_msg, char* dec_msg) { return RSA_private_decrypt(RSA_size(priv_key), enc_msg, (unsigned char*)dec_msg, priv_key, RSA_PKCS1_OAEP_PADDING); } ``` #### 三、关键注意事项 1. **密钥管理**:RSA私钥必须安全存储(建议使用硬件安全模块) 2. **加密模式选择**:推荐AES使用CBC/GCM模式,避免ECB模式[^3] 3. **数据长度限制**:RSA加密数据长度需满足 $data\_len \leq (key\_size/8) - 42$(PKCS1_OAEP填充) 4. **混合加密实践**:实际系统通常结合使用(RSA加密AES密钥,AES加密数据)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值