算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA

本文来自小迪安全

#算法加密-概念&分类&类型

1. 单向散列加密 -MD5

单向散列加密算法的优点有(以MD5为例):

方便存储,损耗低:加密/加密对于性能的损耗微乎其微。

单向散列加密的缺点就是存在暴力破解的可能性,最好通过加盐值的方式提高安全性,此外可能存在散列冲突。我们都知道MD5加密也是可以破解的。

常见的单向散列加密算法有:

MD5 SHA MAC CRC

2. 对称加密 -AES

对称加密优点是算法公开、计算量小、加密速度快、加密效率高。

缺点是发送方和接收方必须商定好密钥,然后使双方都能保存好钥,密钥管理成为双方的负担。

常见的对称加密算法有:

DES AES RC4

3. 非对称加密 -RSA

非对称加密的优点是与对称加密相比,安全性更好,加解密需要不同的密钥,公钥和私钥都可进行相互的加解密。

缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

常见的非对称加密算法:

RSA RSA2 PKCS

#加密解密-识别特征&解密条件

MD5密文特点:

1、由数字“0-9”和字母“a-f”所组成的字符串

2、固定的位数 16 和 32位

解密需求:密文即可,但复杂明文可能解不出

原理:碰撞解密

BASE64编码特点:

0、大小写区分,通过数字和字母的组合

1、一般情况下密文尾部都会有两个等号,明文很少的时候则没有

2、明文越长密文越长,一般不会出现"/""+"在密文中

AES、DES密文特点:

同BASE64基本类似,但一般会出现"/"和"+"在密文中

解密需求:密文,模式,加密Key,偏移量,条件满足才可解出

原理:利用逆向算法还原

RSA密文特点:

特征同AES,DES相似,但是长度较长

解密需求:密文,公钥或私钥即可解出(一般公钥加密 私钥解密 而且每次加密数据都不一样 但都能解密同一个结果)

RSA 有公钥加密解密 和私钥加密解密 如果对方是公钥加密 那么就得用私钥解密 如果对方用私钥加密 那么我们就得公钥解密 

其他密文特点见:

1.30余种加密编码类型的密文特征分析(建议收藏)

https://mp.weixin.qq.com/s?__biz=MzAwNDcxMjI2MA==&mid=2247484455&idx=1&sn=e1b4324ddcf7d6123be30d9a5613e17b&chksm=9b26f60cac517f1a920cf3b73b3212a645aeef78882c47957b9f3c2135cb7ce051c73fe77bb2&mpshare=1&scene=23&srcid=1111auAYWmr1N0NAs9Wp2hGz&sharer_sharetime=1605145141579&sharer_shareid=5051b3eddbbe2cb698aedf9452370026#rd

2.CTF中常见密码题解密网站总结(建议收藏)

https://blog.csdn.net/qq_41638851/article/details/100526839

3.CTF密码学常见加密解密总结(建议收藏)

https://blog.csdn.net/qq_40837276/article/details/83080460

加密解密php代码

password='xiaodisec';

//md5

echo "原始数据:$password". "<br/>";

echo "MD5加密后:".md5($password). "<hr/>";

//base64

echo "原始数据:$password". "<br/>";

echo "BASE64编码后:".base64_encode($password). "<hr/>";

//aes(这里是ECB模式 pks7填充量 base64 和key 进行加密)

echo "原始数据: " . $password . "<br/>";

$data = EncryptionTool::enAES($password, "1234567891234567");

echo "AES加密后: " . $data . "<hr/>";

//echo "解密后: " . EncryptionTool::deAES($data, "1234567891234567") . "<br/>";

//des

echo "原始数据:$password". "<br/>";

$key = 'key123456';

$iv = 'iv123456';

// DES CBC 加解密

echo 'DES CBC 加解密:';

$des = new DES($key, 'DES-CBC', DES::OUTPUT_BASE64, $iv);

echo $base64Sign = $des->encrypt($password);

echo "<br>";

//echo $des->decrypt($base64Sign);

echo "<hr>";

// DES ECB 加解密

echo "原始数据:$password". "<br/>";

echo 'DES ECB 加解密:';

$des = new DES($key, 'DES-ECB', DES::OUTPUT_BASE64);

echo $base64Sign = $des->encrypt($password);

echo "<hr>";

//echo $des->decrypt($base64Sign);

//rsa

//公钥加密

$public_key = openssl_pkey_get_public(RSA_PUBLIC);

if(!$public_key){

    die('公钥不可用');

}

//第一个参数是待加密的数据只能是string,第二个参数是加密后的数据,第三个参数是openssl_pkey_get_public返回的资源类型,第四个参数是填充方式

$return_en = openssl_public_encrypt($password, $crypted, $public_key);

if(!$return_en){

    return('加密失败,请检查RSA秘钥');

}

$eb64_cry = base64_encode($crypted);

echo "RSA公钥加密数据:".$eb64_cry;

echo "<br>";

//私钥解密

$private_key = openssl_pkey_get_private(RSA_PRIVATE);

if(!$private_key){

    die('私钥不可用');

}

$return_de = openssl_private_decrypt(base64_decode($eb64_cry), $decrypted, $private_key);

if(!$return_de){

    return('解密失败,请检查RSA秘钥');

}

echo "RSA私钥解密数据:".$decrypted;

echo "<hr>";

//私钥加密

$private_key = openssl_pkey_get_private(RSA_PRIVATE);

if(!$private_key){

    die('私钥不可用');

}

$return_en = openssl_private_encrypt($password, $crypted, $private_key);

if(!$return_en){

    return('加密失败,请检查RSA秘钥');

}

$eb64_cry = base64_encode($crypted);

echo "RSA私钥加密数据".$eb64_cry;

echo "<br>";

//公钥解密

$public_key = openssl_pkey_get_public(RSA_PUBLIC);

if(!$public_key){

    die('公钥不可用');

}

$return_de = openssl_public_decrypt(base64_decode($eb64_cry), $decrypted, $public_key);

if(!$return_de){

    return('解密失败,请检查RSA秘钥');

}

echo "RSA公钥解密数据:".$decrypted;

echo "<hr>";

?>

对于实战而言

假设拿到了数据库权限 拿到了密码 但密码是加密的 无法解出来 那么我们需要先判断大致的方向 然后配合源码分析(没有源码只能靠猜了)或者看前端代码 因为可能前端也有加密算法

#解密实例-密文存储&数据传输

1、密码存储(后端处理)

X3.2-md5&salt

DZ对应代码段-/uc_server/model/user.php

 function add_user() {

  $password = md5(md5($password).$salt);

    }

X3.5版本-hash

DZ对应代码段-/uc_server/model/user.php

 function add_user() {

  $salt = '';

  $password = $this->generate_password($password);

    }

 function generate_password($password) {

  $algo = $this->get_passwordalgo();

  $options = $this->get_passwordoptions();

  $hash = password_hash($password, $algo, $options);

 }

解密算法:

<?PHP

$hash = '$2y$10$KA.7VYVheqod8F3X65tWjO3ZXfozNA2fC4oIZoDSu/TbfgKmiw7xO';

if (password_verify('123456', $hash)) {

    echo 'ok';

} else {

    echo 'error';

}

?>

这个3.5版本的加密是php内置的加密算法 解密工具是解不出来的所以要写脚本来碰撞解密这就用到password_verify函数了 将$hash 进行解密来与密码进行比对 正确返回ok 不正确返回error

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值