*小学生的爱情*
Base64解码获得flag
*中学生的爱情*
社会主义核心价值观在线解码得到flag
http://www.atoolbox.net/Tool.php?Id=850
*高中生的爱情*
U2FsdG开头为rabbit密码,又提示你密钥为love。本地toolfx密码工具箱解密。不知道为什么在线解密不行。
*大学生的爱情*
RSA经典题目。p和q相近。所以p和q都在根号n附近。利用yafu工具可以快速分解。
print(m)
if b’}’ in m:
然后按照常规RSA解密方法解密。
# -- coding:utf-8 --
“”"
作者:Wang Xinwei
日期:2024年03月24日
“”"
import gmpy2
from Crypto.Util.number import *
flag = b"ESCTF{ESCTF{RSA_is_funny}}"
e = 65537
# p = getPrime(512)
# q= gmpy2.next_prime§
# n = p*q
# flag = bytes_to_long(flag)
# print(“n=”,n)
# print(“c=”,pow(flag,e,n))
n= 87254900731666390884159209626800356941785001488525028591769229485924739081602066332966326665723327730641614285135512192017583701591135917500641570064083902206611923810507034233576256144022964882158178811976242807609586302888952567775205131598018225511164558967215597973206810360256277874273106458003025660413
c= 1923721988386660054359926820655269448778767748309860489866383200366095142690520062399782483000966795116503564066444275987756271219973359161455872735303102581691939422025939521785848668195964077055819184084424817164624658309707329849413844319960704177703085691752420300231366661259420651913926188761637950330
#yafu分解
p= 9341033172602824606894341736533287160404224130835180730745999603156252793202779809792247727309047140672750893886744443371092448221030199795677817036457241
q = 9341033172602824606894341736533287160404224130835180730745999603156252793202779809792247727309047140672750893886744443371092448221030199795677817036457093
d=inverse(e,(p-1)*(q-1))
print(long_to_bytes(pow(c,d,n)))
*研究生的爱情*
RSA经典题目共模攻击
以下是通用RSA共模攻击脚本
# -- coding:utf-8 --
“”"
作者:Wang Xinwei
日期:2023年12月25日
“”"
from Crypto.Util.number import *
#e互质
def crack(c1,c2,e1,e2,n):
r, s, _ = edge(e1, e2)
if r < 0:
r = -r
c1 = inverse(c1, n)
else:
s = -s
c2 = inverse(c2, n) # 取逆元
m = pow(c1, r, n) * pow(c2, s, n) % n
return m
def edge(a,b):
u,u1=1,0
v,v1=0,1
while b:
q,r=divmod(a,b) #返回除数和商
u,u1=u1,u-q*u1
v,v1=v1,v-q*v1
a,b=b,r
return u,v,a
m=crack(c1,c2,e1,e2,n)
print(long_to_bytes(m))
*密码不能设的太简单了*
Wjw20041333
*0xff*
除了异或还有与啊,每个数与0xff,相与范围在0–255
a=[13637,48723,27715,29268,29766,40571,22380,35183,1399,19039,8805,42089,43367,1896,9844,19295,25193,10355,56159,52582,62060,62305,31079,36733]
for i in a:
print(chr(i&0xff),end=“”)
*base64_roll16*
简单的脚本
# -- coding:utf-8 --
“”"
作者:Wang Xinwei
日期:2024年03月21日
“”"
from base64 import b64encode,b64decode
with open(“task.txt”,“rb”) as f:
for i in range(16):
flag = b64decode(flag)
print(flag)
*我儿王腾,有大帝之姿*
凯撒暴力破解
*md5_crack*
# -- coding:utf-8 --
“”"
作者:Wang Xinwei
日期:2024年03月21日
“”"
import hashlib
#ps,这道题是为了让你学习python编写代码,一起加油吧,只有大写字母,预计需要爆破10分钟左右,这种暴力的题我推荐你用itertools里面的product和tqdm中的进度可视化tqdm。欢迎与我交流。
flag = “ESCTF{****SOPVNFDSFJEJFSLFKDVOPXC**L}”
print(hashlib.md5(flag.encode()).hexdigest())
#9cdfffd57b2e6e809e577105cd05c943
for i in product(string.ascii_uppercase,repeat=6):
s=“”.join(i)
tmp = “ESCTF{”+s[:4]+“SOPVNFDSFJEJFSLFKDVOPXC”+s[4:]+“L}”
if hashlib.md5(tmp.encode()).hexdigest() ==“9cdfffd57b2e6e809e577105cd05c943”:
print(tmp)
*Virgenene*
在线网站https://www.guballa.de/vigenere-solver直接破解
或者猜出密钥是ESCTF,本地toolsfx密码箱破解。
*被攻破的RSA*
*p中有q,q中有p*
费马小定理:如果p是一个质数,而整数a不是p的倍数,则有a(p-1)≡1(mod p)。( ap ≡ a(mod p) )
# -- coding:utf-8 --
“”"
作者:Wang Xinwei
日期:2024年03月22日
“”"
from Crypto.Util.number import *
e =65537
hint1= 9257190176211953944656429226191162921937539029882923390458633035600726340807763702464984476602750202337310848980059046379158262160314085592210157108172217
hint2= 12522536653306632457484965539025737173335741462514062756817436478300395511087417885672387705368503036128243365548253460553613771090473663920725930626070797
c= 75615441114824818982182953844155305965377036100598798618630333600571314511829375696945363055557959181559781415804471507055342868444659562871448832685669789754178889475898700223135742400451539802057653648819134357436154315541073534622583803117701704744407233906430183232086047950048037168491349071656221408613
d = inverse(e,(hint1-1)*(hint2-1))
print(long_to_bytes(pow(c,d,hint1*hint2)))
*初识RSA&MD5*
简单的求完d后再md5
import hashlib
from Crypto.Util.number import *
def crack(e,p,q):
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
return d
if name == “main”:
p = 0x928fb6aa9d813b6c3270131818a7c54edb18e3806942b88670106c1821e0326364194a8c49392849432b37632f0abe3f3c52e909b939c91c50e41a7b8cd00c67d6743b4f
q = 0xec301417ccdffa679a8dcc4027dd0d75baf9d441625ed8930472165717f4732884c33f25d4ee6a6c9ae6c44aedad039b0b72cf42cab7f80d32b74061
e = 0x10001
d=crack(e,p,q)
print(hashlib.md5(str(d).encode()).hexdigest())
*unknown_e*
知道e的范围,在可爆破范围内,可以直接爆破。
# -- coding:utf-8 --
“”"
作者:Wang Xinwei
日期:2024年03月22日
“”"
import random
from Crypto.Util.number import *
from tqdm import tqdm
p= 114023460586166661531783881732905003157974360038162981519868224272334226248043
q= 107973851625536740682697827957048261479275714225294282772072383785133417395489
c= 5259262198642778184810466983247120863897320816825538032188414867552876235867257446291601783804008647953671522710535700007057756326626645320636324436096585
n=p*q
for e in tqdm(range(1<<17,1<<18)):
if not isPrime(e):
continue
d = inverse(e, (p - 1) * (q - 1))
m = long_to_bytes(pow(c,d,n))
if b’ESCTF’ in m:
print(m)
break
*impossible_rsa_revenge*
第一步,共模攻击变形。
知道e的范围,暴力破解两个e。得到flag1
for e1 in range(1<<10,1<<11):
for e2 in range(e1+1, 1 << 11):
m=RSA.common_n.crack(c1,c2,e1,e2,n)
m = long_to_bytes(m)
if b’ESCTF{’ in m:
print(str(m)[2:-1],end=“”)
break
if b’ESCTF{’ in m:
break
第二个用相同的p,q,e加密了100次,解密100次即可。
n=p*q
d = inverse(e,(p-1)*(q-1))
for i in (range(10000)):
m = pow(m,d,n)
print(str(long_to_bytes(m))[2:-1],end =“”)
第三步,用yafu将n分解成32个质数。都是10位的,如果不是,用yafu继续分。直到分成32个为止,放大一个列表里。最后计算欧拉函数,破解。
assert len(factor)==32
n = reduce(lambda a,b:a*b,factor)
phi = 1
for p in factor:
phi = phi*(p-1)
d = inverse(e,phi)
flag3 = long_to_bytes(pow(c,d,n))
print(str(flag3)[2:-1])
第四步:
只给了长整型的一部分。暴力破解,flag只透露了最后一个是},这是解题关键。
继续爆破。
hint = 2066689923305
for i in range(int(hint)*10000,int(hint)*10000+9999):
m = long_to_bytes(i)
if b’}’ in m:
print(m)
里。最后计算欧拉函数,破解。
assert len(factor)==32
n = reduce(lambda a,b:a*b,factor)
phi = 1
for p in factor:
phi = phi*(p-1)
d = inverse(e,phi)
flag3 = long_to_bytes(pow(c,d,n))
print(str(flag3)[2:-1])
第四步:
只给了长整型的一部分。暴力破解,flag只透露了最后一个是},这是解题关键。
继续爆破。
hint = 2066689923305
for i in range(int(hint)*10000,int(hint)*10000+9999):
m = long_to_bytes(i)
if b’}’ in m:
print(m)