http://www.shiyanbar.com/ctf/1824
一串奇怪的数:
请解密密文得到该产品的密钥(最后一组密钥即为key)
解题链接: http://ctf5.shiyanbar.com/crypto/Crypto1
题目描述:给你一串密文, 它的加密代码(附件中)也已经截取, 现得知解密后是某产品的密钥. 下面是密文内容:
-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
解:
几点:
1.首先我想吐槽这个题分给的怎么能是:易,
2.还有的strPasswd应该提醒的给出,让我们猜,那不看答案难啊,本人觉得strPasswd='' 密码为空,这个有点问题。
3.这句话:请解密密文得到该产品的密钥(最后一组密钥即为key)有歧义--->改为: 其实:本题密钥就是明文+我靠。
4.不过这题思想值得学习。
分析:
>>>E:\p>python encode.py
>>>输入字符串: T5Q-4HQ-KEY-KP0-HAH
>>>输入密钥:
>>>加密密文:
>>>-149 -232 -126 -169 -134 -184 -139 -132 -170 -174 -105 -226 -136 -171 -174 -204 -128 -174 -165
可能从这里可以看出strPasswd为空,
自从用了python3.5以上,下载的源码也运行有点小问题,我一边写注释一边修改能正常运行了:
基于python3.0以上的源代码如下:
encode.py
一串奇怪的数:
请解密密文得到该产品的密钥(最后一组密钥即为key)
解题链接: http://ctf5.shiyanbar.com/crypto/Crypto1
题目描述:给你一串密文, 它的加密代码(附件中)也已经截取, 现得知解密后是某产品的密钥. 下面是密文内容:
-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
解:
几点:
1.首先我想吐槽这个题分给的怎么能是:易,
2.还有的strPasswd应该提醒的给出,让我们猜,那不看答案难啊,本人觉得strPasswd='' 密码为空,这个有点问题。
3.这句话:请解密密文得到该产品的密钥(最后一组密钥即为key)有歧义--->改为: 其实:本题密钥就是明文+我靠。
4.不过这题思想值得学习。
分析:
>>>E:\p>python encode.py
>>>输入字符串: T5Q-4HQ-KEY-KP0-HAH
>>>输入密钥:
>>>加密密文:
>>>-149 -232 -126 -169 -134 -184 -139 -132 -170 -174 -105 -226 -136 -171 -174 -204 -128 -174 -165
可能从这里可以看出strPasswd为空,
自从用了python3.5以上,下载的源码也运行有点小问题,我一边写注释一边修改能正常运行了:
基于python3.0以上的源代码如下:
encode.py
#coding:utf-8
import hashlib
def md5(s):#定义md5加密后值 hexdigest十六进制整理
return hashlib.md5(s.encode('ascii') ).hexdigest()#参数必须是byte类型,否则报Unicode-objects must be encoded before hashing错误
def evalCrossTotal(strMd5):#
r = 0
for i in strMd5:
r += int("0x%s" % i, 16)#16进制转化十进制 求和
return r
def encryptString(strString, strPasswd):
strPasswdMd5 = md5(strPasswd)
intMd5= evalCrossTotal(strPasswdMd5)
print(intMd5)
r = []
# \==> 代表换行
for i in range(len(strString)):
r.append(
ord(strString[i]) + \
int("0x%s" % strPasswdMd5[i%32], 16) - \
intMd5
)#ascii数值+strPasswdMd5哪一位十六进制转化十进制-intMd5
intMd5 = evalCrossTotal(
md5(strString[:(i+1)])[:16] + \
md5(str(intMd5))[:16]
)
return " ".join(map(lambda x: str(x), r))
#r队列每一个元素转化str型,['','','','']#join把新队列所有元素空格拼接一起
if __name__=='__main__':
strString=input('输入字符串: ')
strPasswd=input('输入密钥: ')
print('加密密文:')
print(encryptString(strString, strPasswd))
decode.py
# -*- 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))