Hash 爆破
2023/5/7大约 3 分钟sha256爆破md5爆破
sha256 爆破
例题 1 : sha256 [2022网鼎杯] crypto091
小A鼓起勇气向女神索要电话号码,但女神一定要考考他。女神说她最近刚看了一篇发表于安全顶会USENIX Security 2021的论文,论文发现苹果AirDrop隔空投送功能的漏洞,该漏洞可以向陌生人泄露AirDrop发起者或接收者的电话号码和电子邮箱。小A经过一番努力,获得了女神手机在AirDrop时传输的手机号哈希值,但再往下就不会了,你能继续帮助他吗?小A只记得女神手机号是170号段首批放号的联通号码。 Hash:c22a563acc2a587afbfaaaa6d67bc6e628872b00bd7e998873881f7c6fdc62fc
flag格式:
flag{13位电话号码(纯数字,含国家代码)}
google关键字 170号段首批放号的联通号码
, 安全顶会USENIX Security 2021的论文,论文发现苹果AirDrop隔空投送功能的漏洞
,得到信息 联通号码 1709 和 采用的加密方式为 sha256
EXP:
from hashlib import *
Hash = '0xc22a563acc2a587afbfaaaa6d67bc6e628872b00bd7e998873881f7c6fdc62fc'
key = '861709'
for i in range(100000000):
flag = sha256((key+str(i)).encode('utf-8')).hexdigest()
if '0x'+flag == Hash:
print(key+str(i))
例题 2: 采用笛卡尔积新姿势
常规方法采用 for 循环
from hashlib import *
import string
from tqdm import tqdm
import sys
sha256enc = "a8c0939f9abe212c5fa3714d317212a9ef52a6c5b8fff4a6e4ae1cec851fe370"
key = "NSkpCmlLih6f0f0s"
strlist = string.ascii_letters + string.digits
for a in tqdm(strlist):
for b in strlist:
for c in strlist:
for d in strlist:
code = sha256((a + b + c + d + key).encode('utf-8')).hexdigest()
if code == sha256enc:
print(a + b + c + d + key)
sys.exit(0)
采用笛卡尔积方式:
import itertools
import hashlib
import string
sha256enc = "a8c0939f9abe212c5fa3714d317212a9ef52a6c5b8fff4a6e4ae1cec851fe370"
key = "NSkpCmlLih6f0f0s"
# sha256碰撞,得出xxxx的值
code = ''
strlist = itertools.product(string.ascii_letters + string.digits, repeat=4) #存储类型为对象
for i in strlist: #存储的元组
code = i[0] + i[1] + i[2] + i[3]
encinfo = hashlib.sha256((code + key).encode('utf-8')).hexdigest()
if encinfo == sha256enc:
print(code)
break
多层for循环爆破 vs 笛卡尔积方式相比,速度上没太大区别,甚至采用笛卡尔积的方法爆破速度会更慢,单采用笛卡尔积有个好处。python中,对于嵌套多层for循环,break语句只能跳出当前循环,下一层循环还是会继续,python中没有自带的跳出多层循环的函数。而采用笛卡尔积就不会有这个情况。
md5 爆破
例题 3:md5爆破
from hashlib import md5
import string
from tqdm.auto import tqdm
import sys
a = [83,89,78,84,45,86,96,45,115,121,110,116,136,132,132,132,108,128,117,118,134,110,123,111,110,127,108,112,124,122,108,118,128,108,131,114,127,134,108,116,124,124,113,108,76,76,76,76,138,23,90,81,66,71,64,69,114,65,112,64,66,63,69,61,70,114,62,66,61,62,69,67,70,63,61,110,110,112,64,68,62,70,61,112,111,112]
str = ""
for i in a:
str += chr(i-13)
print(str)
MD5 = '38e4c352809e150186920aac37190cbc'
key = 'flag{www_shiyanbar_com_is_very_good_'
#%%
for a in tqdm(string.printable):
for b in string.printable:
for c in string.printable:
for d in string.printable:
flag = key + a + b + c + d + '}'
md5_value = md5((flag).encode()).hexdigest()
# print(md5_value)
if md5_value == MD5:
print(flag)
sys.exit()
else:
continue