CTF題庫>一串奇怪的數 (請解密密文得到該產品的密鑰(最後一組密鑰即爲key))

請解密密文得到該產品的密鑰(最後一組密鑰即爲key)

下載後的文件  需要重命名 後綴  爲 .zip 

解壓後發現

打開txt     

 

題目描述:給你一串密文, 它的加密代碼(附件中)也已經截取, 現得知解密後是某產品的密鑰. 下面是密文內容:
-149 -234 -157 -132 -187 -140 -157 -241 -158 -177 -85 -215 -180 -187 -173 -218 -161 -183 -133 -226 -136 -171 -126 -169 -155 -96 -169 -240 -163 -153 -137 -111 -123 -191 -151 -213 -151 -142 -152 -208 -118 -137 -136 -244 -157 -168 -187 -201 -170 -176 -192 -209 -205 -174 -163 -189 -126 -133 -148 -194 -145 -212 -170 -155 -148 -165 -167 -206 -171 -177 -88 -173 -125 -129 -129 -235 -121 -190 -161 -165
下面是該產品一些公開的密鑰:
T5Q-4HQ-KEY-KP0-HAH
FCK-MNO-KEY-O8W-HAH
MRS-L1H-KEY-FU3-HAH
ICR-AAA-KEY-BBB-HAH

之後另一個文件  encode 打開爲  py腳本

#coding:utf-8

import hashlib

def md5(s):
    return hashlib.md5(s).hexdigest()

def evalCrossTotal(strMd5):
    r = 0
    for i in strMd5:
        r += int("0x%s" % i, 16)
    return r

def encryptString(strString, strPasswd):
    strPasswdMd5 = md5(strPasswd)
    intMd5       = evalCrossTotal(strPasswdMd5)

    r = []

    for i in range(len(strString)):
        r.append(
            ord(strString[i]) + \
            int("0x%s" % strPasswdMd5[i%32], 16) - \
            intMd5
        )
        intMd5 = evalCrossTotal(
            md5(strString[:(i+1)])[:16] + \
            md5(str(intMd5))[:16]
        )
    return " ".join(map(lambda x: str(x), r))

根據這個  寫一個 解密的腳本   並將密文內容加入進去  

s="-149 -234 -157 -132 -187 -140 -157 -241 -158 -177 -85 -215 -180 -187 -173 -218 -161 -183 -133 -226 -136 -171 -126 -169 -155 -96 -169 -240 -163 -153 -137 -111 -123 -191 -151 -213 -151 -142 -152 -208 -118 -137 -136 -244 -157 -168 -187 -201 -170 -176 -192 -209 -205 -174 -163 -189 -126 -133 -148 -194 -145 -212 -170 -155 -148 -165 -167 -206 -171 -177 -88 -173 -125 -129 -129 -235 -121 -190 -161 -165"

 

# -*- coding: utf8 -*-
import hashlib
 
def md5(s):
    return hashlib.md5(s.encode('ascii') ).hexdigest()
 
def evalCrossTotal(strMd5):
    r = 0
    for i in strMd5:
        r += int("0x%s" % i, 16)
    return r
 
def encryptString(strString, strPasswd):
    strPasswdMd5 = md5(strPasswd)
    intMd5       = evalCrossTotal(strPasswdMd5)
 
    r = []
 
    for i in range(len(strString)):
        r.append(
            ord(strString[i]) + \
            int("0x%s" % strPasswdMd5[i%32], 16) - \
            intMd5
        )
		#print(r)
        intMd5 = evalCrossTotal(
            md5(strString[:(i+1)])[:16] + \
            md5(str(intMd5))[:16]
        )
    return " ".join(map(lambda x: str(x), r))
 
#結合encode寫decode
#以下就是自己寫的
def decryptString(r,strPasswd):
#前兩句不變
	strPasswdMd5 = md5(strPasswd)
	intMd5       = evalCrossTotal(strPasswdMd5)
#求逆
	strString = ""
	#len(r)代表tuple元素個數。。。。可以看出r的元素個數和strString的字符數是相同的
	for i in range(len(r)):
		strString+=chr(r[i] - int("0x%s" % strPasswdMd5[i%32], 16) + intMd5)#自己理解
		
		intMd5 = evalCrossTotal(md5(strString[:(i+1)])[:16] + md5(str(intMd5))[:16])#沒有變
	return strString
 
 
 
if __name__ == '__main__':
	s="-149 -234 -157 -132 -187 -140 -157 -241 -158 -177 -85 -215 -180 -187 -173 -218 -161 -183 -133 -226 -136 -171 -126 -169 -155 -96 -169 -240 -163 -153 -137 -111 -123 -191 -151 -213 -151 -142 -152 -208 -118 -137 -136 -244 -157 -168 -187 -201 -170 -176 -192 -209 -205 -174 -163 -189 -126 -133 -148 -194 -145 -212 -170 -155 -148 -165 -167 -206 -171 -177 -88 -173 -125 -129 -129 -235 -121 -190 -161 -165"
	r=eval('[%s]' %s.replace(' ',','))#eval可以把list,tuple,dict和string相互轉化。
	#print(r)
	strPasswd='' #密碼爲空
	print(decryptString(r,strPasswd))

之後運行  

 

根據題目提示   最後一個爲flag

SEC-URI-KEY-TYB-HAH

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章