简单随机与亦或
###2022DASCTF Apr X FATE 防疫挑战赛
##CRYPTO
#easy_real
题目
import random import hashlib flag = 'xxxxxxxxxxxxxxxxxxxx' key = random.randint(1,10) for i in range(len(flag)): crypto += chr(ord(flag[i])^key) m = crypto (ascii的16进制) e = random.randint(1,100) print(hashlib.md5(e)) p = 64310413306776406422334034047152581900365687374336418863191177338901198608319 q = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx n = p*q c = pow(m,e,n) print(n) print(c) #37693cfc748049e45d87b8c7d8b9aacd #4197356622576696564490569060686240088884187113566430134461945130770906825187894394672841467350797015940721560434743086405821584185286177962353341322088523 #3298176862697175389935722420143867000970906723110625484802850810634814647827572034913391972640399446415991848730984820839735665233943600223288991148186397
1、简单求出一些变量
MD5-->e=23
q=n/p-->q=65267138038038699886916162739434586079731613825212388229424706115289974540917
2、写代码
import gmpy2
from Crypto.Util.number import * p=64310413306776406422334034047152581900365687374336418863191177338901198608319 e=23 n=4197356622576696564490569060686240088884187113566430134461945130770906825187894394672841467350797015940721560434743086405821584185286177962353341322088523 c=3298176862697175389935722420143867000970906723110625484802850810634814647827572034913391972640399446415991848730984820839735665233943600223288991148186397 q=65267138038038699886916162739434586079731613825212388229424706115289974540917 phi = (p-1)*(q-1) d = gmpy2.invert(e,phi) m = pow(c,d,n) print(m) print(long_to_bytes(m)) #2976168736142380455841784134407431434784057911773423743751382131043957 #b'ndios_;9kgE;WK8e;W?gWn<\\;k|nu' crypto='ndios_;9kgE;WK8e;W?gWn<\\;k|nu' flag='' for key in range(1,10): for i in range(len(crypto)): flag += chr(ord(crypto[i])^key)#(ord():字符转为十进制;chr():十进制或十六进制转化为字符) print(flag)
3、解得:flag{W31coM3_C0m3_7o_f4T3ctf}
oehnr^:8jfD:VJ9d:V>fVo=]:j}otlfkmq]9;ieG9UI:g9U=eUl>^9i~lwmgjlp\8:hdF8TH;f8T<dTm?_8hmvj`mkw[?=ocA?SO<a?S;cSj8X?oxjqkaljvZ><nb@>RN=`>R:bRk9Y>nykphboiuY=?maC=QM>c=Q9aQh:Z=mzhsicnhtX<>l`B<PL?b<P8`Pi;[<l{irflag{W31coM3_C0m3_7o_f4T3ctf}gm`fzV20bnL2^B1l2^6n^g5U2bug|
4、攻击原理
1、通过md5解码获得e的值
2、已知p、q、e、c求得m(最简单的RSA题型)
步骤 | 说明 | 描述 |
1 | 选择一对不相等且足够大的质数 | p、q |
2 | 计算p、q的乘积 | n=p*q |
3 | 计算n的欧拉函数 | φ(n)=(p-1)*(q-1) |
4 | 选一个与φ(n)互质的整数e | 1<e<φ(n) |
5 | 计算出e对于φ(n)的模反元素d | de mod φ(n)=1 |
6 | 公钥 (加密数据) | KU=(e,n) |
7 | 私钥 (解密数据) | KR=(d,n) |
欧拉函数:小于n的正整数中与n互质的数的数目φ(n)=n-1
互质:公约数只有1的两个整数
如果n可以分解为2个互质的整数之积,那么n的欧拉函数等于这两个因子的欧拉函数之积。及若n=p*q,且p、q互质,则φ(n)=φ(p*q)=φ(p)*φ(q)=(p-1)*(q-1)
如果两个正整数e和φ(n)互质,那么一定可以找到一个整数d,使得ed-1被φ(n)整除,或者说ed除以φ(n)所得余数为1,此时d就叫做e的模反元素。
d = gmpy2.invert(e,φ(n)) # 求逆元,ed ≡ 1 mod φ(n)
明文 M 加密 M**e mod n=C
密文 C 解密 C**d mod n=M
模运算(单向函数):单项计算容易,逆向反推却很难
3、异或(^):当两对应的二进位相异时,结果为1
RSA脚本大多引用自https://lazzzaro.github.io/2020/05/06/crypto-RSA/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】