加密算法

常见加密编码等算法解析

MD5,SHA,ASC,进制,时间戳,URL,BASE64,Unescape,AES,DES 等

常见加密形式算法解析

直接加密,带 salt,带密码,带偏移,带位数,带模式,带干扰,自定义组合等

常见解密方式

枚举,自定义逆向算法,可逆向

了解常规加密算法的特性

长度位数,字符规律,代码分析,搜索获取等

Hash不可逆:

MD5

不论加密原文数据多长,密文长度固定为32位,密文以0-9和a-z组成

16位MD5

顾名思义密文长度为16位,密文以0-9和a-z组成

MD4

不论加密原文数据多长,密文长度固定为32位,密文以0-9和a-z组成

SHA1

不论加密原文数据多长,密文长度固定为40位,密文以0-9和a-z组成

SHA256

不论加密原文数据多长,密文长度固定为64位,密文以0-9和a-z组成

SHA384

不论加密原文数据多长,密文长度固定为96位,密文以0-9和a-z组成

SHA512

不论加密原文数据多长,密文长度固定为128位,密文以0-9和a-z组成

CRC32

不论加密原文数据多长,密文长度固定8位,密文以0-9和a-z组成

可逆解密:

16进制文本(文字处理)

密文随原文(明文)长度变化而变化,密文由0-9和A-F(注意是大写字母)组成

Unix时间戳转换

将每某一个时间点转化为一个时间累计量;如:2005年6月6日18时35分45秒 —> 1118054145

思考一下考察点是否涉及时间,如果与时间点有关并且密文是一串数字就很有可能是时间戳转换,如:记录用户登入时间点

URL(编码解码)

一个原文字符转换为一组字符;一组字符:%(0-9或A-Z)(0-9或A-Z)

例子:小米 --> %D0%A1%C3%D7 (由于一个中文占2个字节)

BASE64(编码解码)

密文随原文(明文)长度变化而变化,密文由0-9和A-Z和a-z组成,一般后面都跟着==或=或没有等号

Encode(编码解码)

0-9和a-z和A-Z不变,中文编码后与URL一样,一个原文字符转换为一组字符;一组字符:%(0-9或A-Z)(0-9或A-Z)

例子:asdAac213啊啊啊 --> asdAac213%B0%A1%B0%A1%B0%A1

Unescape(编码解码)

密文由多组%(0-9或a-z)(0-9或a-z)(0-9或a-z)(0-9或a-z) 组成

例子:8848 --> %u3838%u3834%u0000

DES(带参数加密)

参数就只有一个密码,明文与你设置的密码一同组合加密,密文随明文长度变化而变化,密文由0-9和A-Z和a-z组成,也有可能末尾出现==,特色是有时会出现 / 或 +

AES(带参数加密)

哪个加密算法长度能变短一些 加密后长度不变的算法_算法

密码和偏移量都是你自己设置的,使加密具有“特色”,最主要也是这两个参数,如果已经知道密码和偏移量的时候,其他的模块可以组合一个个都试一遍,总共多少排列组合呢(大概900总组合),其实写个脚本跑也还好;如果你连密码和偏移量这两个都不知道或只知道其中一个,那你还是别想去怎么解密了,无解,神仙来了都不好使!!!

自定义加密算法

<?php
function encrypt($data, $key)
{
    $key = md5('ISCC');
    #print $key;
    $x = 0;
    $len = strlen($data);
    $klen = strlen ($key);
    #print $len;
    for($i=0; $i < $len; $i++){
        if($x == $klen)
            $x = 0 ;
        $char .= $key[$x];
        $x += 1;
        #print $key[$X];
    }
    #print $char[0].$char[1].$char[2];
    for ($i=0;$i<$len; $i++){
        $str .= chr ((ord ($data[$i]) + ord ($char[$i]))%128);
    }
    return base64_encode ($str);
}
echo encrypt('helloword');
?>

自定义解密算法

<?php
function decrypt($str){
    $mkey = md5('ISCC');
    $klen = strlen($mkey);
    $tmp = $str;
    $tmp = base64_decode($tmp);         //解密base64
    $md_len = strlen($tmp);            //获取输入加密字符长度
    $x = 0;
    $char = "";                         //临时数组
    
    for ($i=0; $i<$md_len; $i++){
        if ($x == $klen){               //当加密字符串长度超出key
             $x = 0;                    //的长度时查重头开始和获取    
        }
        $char .= $mkey[$x];             //.= 累积函数
        $x += 1;
    }    

    $md_data = array();                 //获取加密字符中的ASCII数据
    for ($i=0; $i<$md_len; $i++){
        array_push($md_data,ord($tmp[$i]));
    }
    
    $md_data_source = array();
    $data1 = "";
    $data2 = "";
    foreach ($md_data as $key => $value){//最终还原
        $i = $key;
        if($i >= strlen($mkey)){
            $i = $i - strlen($mkey);
        }
        $dd = $value;
        $od = ord($mkey[$i]);
        array_push($md_data_source,$dd);
        $data1 .=chr(($dd+128)-$od);        //原数据加key的Ascii大于128
        $data2 .=chr($dd-$od);              //原数据加key的Ascii小于128
    }
    
    print "data1 =>".$data1."<br>\n";
    print "data2 =>".$data2."<br>\n";
}

$str = 'HxclIiEqIiUY';
decrypt($str);
?>

带盐加密:md5(md5(salt))