crypto-初识RSA(xctf)

本文介绍了RSA加密算法的基础知识,并通过Python代码展示了如何生成RSA密钥对,以及如何对明文进行加密和解密。在示例中,详细解析了给定的RSA加密数据,利用已知的pq、qp和n值计算出phi(n),进一步求得解密指数d,最后成功解密得到原始的明文flag。

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

RSA入门题,记录一下。
源码:

from Crypto.Util.number import bytes_to_long,inverse,getPrime
from flag import flag

m = bytes_to_long(flag)

p = getPrime(1024)
q = getPrime(1024)
n = p*q
print(n)
e = 65537

c = pow(m,e,n)

pq = p*(q-1)
qp = q*(p-1)

print("c=",c)
print("n=",n)
print("pq=",pq)
print("qp=",qp)

'''
c= 8722269075970644434253339592758512788160408912707387632591552130175707843950684315083250494010055435391879036285103810263591951437829414438640307561645721347859659807138051841516634704123100270651976676182059252251162982609391666023674158274992400910869692389001622774140191223807887675081808561012755545464977015973615407965906513878979919700065923364884766974187303774330319143647840846354404070430118235352622445115153298578370521811697710289716188726587743282814946239856766713516166990341116198180068191759095913957606379780234116317390622824096667107736103270907349927467971817639795094030622157581511033950777
n= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074584935050067254029262890188260006596141011807724688556673520261743199388391094490191001701011230322653422314758778116196105077883955436582364267530633358016652912054880813710531145973799193443828969535902856467548523653920307742364119002349899553478815101092655897400295925170383678499125295006364960124859003
pq= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074488896197029704465200125337817646702009123916866455067019234171839614862660036737875747177391796376553159880972782837853473250804807544086701088829096838316550146794766718580877976153967582795248676367265069623900208276878140709691073369415161936376086988069213820933152601453587292943483693378833664901178324
qp= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074475956379708898904933143429835002718457573266164923043251954374464149976302585916538814746811455883837138715445492053610047383292461097590195481556557381952895539341802954749542143253491617052100969586396996063822508764438280468492894012685918249843558593322831683872737943676955669923498182824352081785243246
'''

题目逻辑很简单,p,q 都是1024bit素数,给出 n=p*q pq=p*(q-1) qp=q*(p-1) 还有RSA加密后的密文 c 求明文flag
显然pq×qp=p(q−1)q(p−1)=n×phi(n)pq \times qp = p(q-1)q(p-1) = n \times phi(n)pq×qp=p(q1)q(p1)=n×phi(n)
pq×qpn=phi(n)\frac{pq \times qp}{n}=phi(n)npq×qp=phi(n)
然后套RSA解密脚本解密即可。

最终exp:

import gmpy2
from Crypto.Util.number import *

c= 8722269075970644434253339592758512788160408912707387632591552130175707843950684315083250494010055435391879036285103810263591951437829414438640307561645721347859659807138051841516634704123100270651976676182059252251162982609391666023674158274992400910869692389001622774140191223807887675081808561012755545464977015973615407965906513878979919700065923364884766974187303774330319143647840846354404070430118235352622445115153298578370521811697710289716188726587743282814946239856766713516166990341116198180068191759095913957606379780234116317390622824096667107736103270907349927467971817639795094030622157581511033950777
n= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074584935050067254029262890188260006596141011807724688556673520261743199388391094490191001701011230322653422314758778116196105077883955436582364267530633358016652912054880813710531145973799193443828969535902856467548523653920307742364119002349899553478815101092655897400295925170383678499125295006364960124859003
pq= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074488896197029704465200125337817646702009123916866455067019234171839614862660036737875747177391796376553159880972782837853473250804807544086701088829096838316550146794766718580877976153967582795248676367265069623900208276878140709691073369415161936376086988069213820933152601453587292943483693378833664901178324
qp= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074475956379708898904933143429835002718457573266164923043251954374464149976302585916538814746811455883837138715445492053610047383292461097590195481556557381952895539341802954749542143253491617052100969586396996063822508764438280468492894012685918249843558593322831683872737943676955669923498182824352081785243246

phin = pq*qp//n
e = 0x10001
d = gmpy2.invert(e, phin)

m = pow(c, d, n)
print(long_to_bytes(m))
### 使用 Crypto-JS 实现 RSA 加解密 需要注意的是,`CryptoJS` 主要专注于对称加密算法如AES,并不直接提供RSA加解密功能[^3]。对于RSA加解密,在JavaScript环境中通常会使用专门的库比如 `jsencrypt` 来处理。 然而,为了满足需求,下面展示了一个结合 `JSEncrypt` 和 `CryptoJS` 的混合方案来实现公私钥对消息的签名验证过程中的部分环节——即先用AES加密数据再用RSA保护AES秘钥的方式: #### 安装依赖包 首先确保已经引入了必要的库文件: - JSEncrypt 用于生成RSA密钥对以及执行基于这些密钥的操作。 - CryptoJS 提供各种实用工具函数和分组密码模式的支持。 可以通过CDN链接快速加载这两个库到HTML页面中: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script> ``` #### 数据加密流程 ##### AES加密待传输的数据并保存随机产生的AES Key ```javascript function generateAesKey() { const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let key = ''; while (key.length < 32) { // AES-256 requires a 256-bit (32-byte) key. key += charset.charAt(Math.floor(Math.random() * charset.length)); } return key; } // Generate an IV for encryption const iv = CryptoJS.lib.WordArray.random(16); // Encrypt the message using AES with CBC Mode and PKCS7 Padding function encryptMessage(message, aesKey) { const cipherText = CryptoJS.AES.encrypt( message, CryptoJS.enc.Utf8.parse(aesKey), { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); return cipherText.ciphertext.toString(CryptoJS.enc.Base64); } ``` ##### 使用接收方提供的公钥加密之前得到的AES Key ```javascript function rsaEncrypt(publicKeyStr, dataToBeEncrypted){ var encryptor = new JSEncrypt(); encryptor.setPublicKey(publicKeyStr); return encryptor.encrypt(dataTo be Encrypted); } ``` #### 解密端操作 在另一侧接收到上述两部分内容之后,则按照相反顺序完成整个还原工作: 1. 利用本地存储着对应的私钥解开被保护起来的那个临时使用的AES session key; 2. 接下来就可利用这个恢复出来的session key去解锁实际的消息体了; 这里省略了解码的具体逻辑因为这取决于具体应用场景下的协议设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值