简易可逆加密解密算法

分享一个简单的可逆加密解密算法

1.基本原理

(1)使用base64_encode和base64_decode函数作为可逆的加密和解密工作函数

(2)把base64_encode出来的字符串通过某种方式进行分拆组成新的字符串实现加密

(3)把字符串通过逆向的分拆组成原来生成的base64_encode出来的字符串,再用base64_decode函数实现解密

2.具体实现

(1)需求,用户登录后,需要把phone和password存储到cookie中,但是为了让cookie中的数据更安全,如隐藏phone这个隐私信息,同时又方便服务器读取解密实现自动登录

(2)代码如下:

// phone为11位,password为md5加密后的32位字符串
$user_info = ['phone'=>12345678901, 'password'=>'1qaz2wsx3edc4rfv5tgb6yhn7ujm8ikk'];
// 转为json字符串,可存入cookie,但有些信息可能会暴露
// -------------以下为加密方法----------------
$json = json_encode($user_info);
// {"phone":12345678901,"password":"1qaz2wsx3edc4rfv5tgb6yhn7ujm8ikk"}
// 转为base64字符串
$b64 = base64_encode($json);
// eyJwaG9uZSI6MTIzNDU2Nzg5MDEsInBhc3N3b3JkIjoiMXFhejJ3c3gzZWRjNHJmdjV0Z2I2eWhuN3VqbThpa2sifQ==
// 长度为92,可以用"_"等字符补齐
$fade_b64 = $b64.'________';
// eyJwaG9uZSI6MTIzNDU2Nzg5MDEsInBhc3N3b3JkIjoiMXFhejJ3c3gzZWRjNHJmdjV0Z2I2eWhuN3VqbThpa2sifQ==________
// 把得到的字符串按10的长度分割为10份
$line_arr = [];
for($i = 0; $i < 10; $i++) {
    $line_arr[] = substr($fade_b64, $i*10, 10);
}
// Array ( 
//      [0] => eyJwaG9uZS |
//      [1] => I6MTIzNDU2 |
//      [2] => Nzg5MDEsIn |
//      [3] => Bhc3N3b3Jk |
//      [4] => IjoiMXFhej |
//      [5] => J3c3gzZWRj |
//      [6] => NHJmdjV0Z2 |
//      [7] => I2eWhuN3Vq |
//      [8] => bThpa2sifQ |
//      [9] => ==________ V 
//      先组装第一列eINBIJNIb=
//      以此类推
//  ) 
// 对分割好的字符串进行重新组装
$sign = '';
for($i = 0; $i < 10; $i++) {
    for($j = 0; $j < 10; $j++) {
        $sign .= $line_arr[$j][$i];
    }
}
// 得到最终的加密串
// eINBIJNIb=y6zhj3H2T=JMgcocJeh_wT53i3mWp_aIMNMgdha_GzD3Xzju2_9NEbFZVNs_uDs3hW03i_ZUIJeRZVf_S2nkjj2qQ_

// -------------以下为解密方法----------------
// 把字符串分为10为单位的10份
$line_arr = [];
for($i = 0; $i < 10; $i++) {
    $line_arr[] = substr($sign, $i*10, 10);
}
//
// Array ( 
//      [0] => eINBIJNIb= |
//      [1] => y6zhj3H2T= |
//      [2] => JMgcocJeh_ |
//      [3] => wT53i3mWp_ |
//      [4] => aIMNMgdha_ |
//      [5] => GzD3Xzju2_ |
//      [6] => 9NEbFZVNs_ |
//      [7] => uDs3hW03i_ |
//      [8] => ZUIJeRZVf_ |
//      [9] => S2nkjj2qQ_ V
//      先组装第一列eyJwaG9uZS
//      以此类推
//  )
//
$fade_b64 = '';
for($i = 0; $i < 10; $i++) {
    for($j = 0; $j < 10; $j++) {
        $fade_b64 .= $line_arr[$j][$i];
    }
}
// 得到伪装过的b64字符串
// eyJwaG9uZSI6MTIzNDU2Nzg5MDEsInBhc3N3b3JkIjoiMXFhejJ3c3gzZWRjNHJmdjV0Z2I2eWhuN3VqbThpa2sifQ==________
$b64 = substr($fade_b64, 0, 92);
// 取出混淆字符串"_"
// eyJwaG9uZSI6MTIzNDU2Nzg5MDEsInBhc3N3b3JkIjoiMXFhejJ3c3gzZWRjNHJmdjV0Z2I2eWhuN3VqbThpa2sifQ==
$json = base64_decode($b64);
// 最终得到加密前的数据
// {"phone":12345678901,"password":"1qaz2wsx3edc4rfv5tgb6yhn7ujm8ikk"}
3.应用场景

此种加密方法实现简单,可以把信息存储在像cookie这种暴露出来的应用中

4.这只是想到的一种比较简单的可逆的加密解密方式,数据组装部分用了最简单的 “ 按列从上到下 ” 组装的方式,破解可能会比较容易,也可以用 " 按列从上到下,从下到上 " 混合、“ 对角线 ” 方法等,然后再加以字符的统一替换,如 a 全部替换为 A 等替换法,可以使加密效果更好,更不容易破解。最近用到了这种算法,与大家分享,当抛砖引玉了~用心,多动脑,就算是用php这种超级简单的语言,也可以做出厉害的东西!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值