结合php的密码学的题目
给源码和output: fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA= 求输入值即flag
function encrypt($data,$key)
{
$key = md5('ISCC');//32位
$x = 0;
$len = strlen($data);//输入值data长度
$klen = strlen($key);//key的长度 32
for ($i=0; $i < $len; $i++) {
if ($x == $klen)//当x>klen(32)时,从x=0开始重新循环
{
$x = 0;
}
$char .= $key[$x];//拼接成新的字符串char
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);//char()从ascii返回字符,ord()返回ascii
}
return base64_encode($str);
}
?>
第一种解法
参考了https://www.jianshu.com/p/7f07b5c00da2
# -*- coding: UTF-8 -*-
import base64
# import hashlib
def detrcy(b64):
int_b64 = []
b64de = base64.b64decode(b64)
# print 'b64de-->', b64de
# print 'len_b64de-->', len(b64de)
for i in range(len(b64de)):
int_b64.append(ord(b64de[i]))
# print 'int_b64-->',int_b64
# print 'len_int_b64-->', len(int_b64)
key = '729623334f0aa2784a1599fd374c120d729623' # 知道data的长度后直接写出来
int_key = []
for i in range(len(key)):
int_key.append(ord(key[i]))
# print 'int_key-->', int_key
flag = ''
for i in range(len(int_b64)):
flag += chr((int_b64[i]-int_key[i]+128) % 128)# +128是因为int_b64[i]-int_key[i]可能<128
'''
举个例子仔细思考一下
加密时(flag[i]+key[i])%128 = output[i]
假设flag[i]+key[i]<128 则 (flag[i]+key[i])%128 = flag[i]+key[i] =output[i] 那么 解密时(output[i]-key[i])%128=flag[i]
假设flag[i]+key[i]>128 则 (flag[i]+key[i])%128 = 余数 那么flag[i]+key[i]=output[i]+128 那么 解密时(output[i]-key[i]+128)%128=flag[i]
'''
print flag
if __name__ == '__main__':
# str_b64 = eccrypt('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
# print 'str_b64-->', str_b64
str_b64 = 'fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA='
# print 'str_b64-->', str_b64
detrcy(str_b64)
第二种解法 爆破
python2
import string
import base64
key='729623334f0aa2784a1599fd374c120d'
ciper=map(ord,base64.b64decode('fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA='))//列表,将output解码
flag=''
list = string.printable#字典,所有可见字符
for i in range(len(ciper)):
for j in list:
if ((ord(j) + ord(key[i % 32])) % 128)== ciper[i]:
flag+=j
print flag
python3
import string
import base64
key='729623334f0aa2784a1599fd374c120d'
ciper=base64.b64decode('fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=')
#print(list(ciper))
#print(len(ciper))
flag=''
list1 = string.printable#字典,string.printable 包括所有可见字符集
for i in range(len(ciper)):#len(ciper)=38
for j in list1:
if ((ord(j) + ord(key[i % 32])) % 128) == ciper[i]:#爆破,判断
'''
由于key始终是32位,但是len(ciper)有38位,势必会出现i>32的情况,这是key[i]超限报错
i<32,i%32=i
i>32,
'''
flag += j
print(''.join(flag))
网友评论