加密算法
常见加密编码等算法解析
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))