一串奇怪的数:

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

#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))



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值