美文网首页
BugkuCTF_PHP_encrypt_1(ISCCCTF)

BugkuCTF_PHP_encrypt_1(ISCCCTF)

作者: Visianlee | 来源:发表于2019-06-07 19:17 被阅读0次

    结合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))
    

    相关文章

      网友评论

          本文标题:BugkuCTF_PHP_encrypt_1(ISCCCTF)

          本文链接:https://www.haomeiwen.com/subject/smjvxctx.html