php对数字字符串加解密
php里面简单的加解密函数:
#测试加解密
public function testAuthCode()
{$encypt = $this->authCode('1', 'qwe');$decypt = $this->authCode($encypt, 'DECODE');echo $encypt . '<br>';echo $decypt . '<br>';
}#加密解密函数,只有当$operation=DECODE的时候,才是解密:
public function authCode($string, $operation = 'DECODE', $key = '', $expiry = 0)
{// 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙$ckey_length = 4;// 密匙#这个key值可以临时传,我这边时设置一个固定的,存在配置文件里面$key = md5($key ? $key : config('kid_crm.auth_key'));// 密匙a会参与加解密$keya = md5(substr($key, 0, 16));// 密匙b会用来做数据完整性验证$keyb = md5(substr($key, 16, 16));// 密匙c用于变化生成的密文$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) :substr(md5(microtime()), -$ckey_length)) : '';// 参与运算的密匙$cryptkey = $keya . md5($keya . $keyc);$key_length = strlen($cryptkey);// 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),//解密时会通过这个密匙验证数据完整性// 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;$string_length = strlen($string);$result = '';$box = range(0, 255);$rndkey = array();// 产生密匙簿for ($i = 0; $i <= 255; $i++) {$rndkey[$i] = ord($cryptkey[$i % $key_length]);}// 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度for ($j = $i = 0; $i < 256; $i++) {$j = ($j + $box[$i] + $rndkey[$i]) % 256;$tmp = $box[$i];$box[$i] = $box[$j];$box[$j] = $tmp;}// 核心加解密部分for ($a = $j = $i = 0; $i < $string_length; $i++) {$a = ($a + 1) % 256;$j = ($j + $box[$a]) % 256;$tmp = $box[$a];$box[$a] = $box[$j];$box[$j] = $tmp;// 从密匙簿得出密匙进行异或,再转成字符$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));}if ($operation == 'DECODE') {// 验证数据有效性,请看未加密明文的格式if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {return substr($result, 26);} else {return '';}} else {// 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因// 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码return $keyc . str_replace('=', '', base64_encode($result));}
}
看到了另外一种,使用openssl实现的:
// Original PHP code by Chirp Internet: www.chirp.com.au
// Please acknowledge use of this code by including this header.namespace Chirp;class Cryptor
{protected $method = 'aes-128-ctr'; // default cipher method if none suppliedprivate $key;protected function iv_bytes(){return openssl_cipher_iv_length($this->method);}public function __construct($key = FALSE, $method = FALSE){if(!$key) {$key = php_uname(); // default encryption key if none supplied}if(ctype_print($key)) {// convert ASCII keys to binary format$this->key = openssl_digest($key, 'SHA256', TRUE);} else {$this->key = $key;}if($method) {if(in_array(strtolower($method), openssl_get_cipher_methods())) {$this->method = $method;} else {die(__METHOD__ . ": unrecognised cipher method: {$method}");}}}public function encrypt($data){$iv = openssl_random_pseudo_bytes($this->iv_bytes());return bin2hex($iv) . openssl_encrypt($data, $this->method, $this->key, 0, $iv);}// decrypt encrypted stringpublic function decrypt($data){$iv_strlen = 2 * $this->iv_bytes();if(preg_match("/^(.{" . $iv_strlen . "})(.+)$/", $data, $regs)) {list(, $iv, $crypted_string) = $regs;if(ctype_xdigit($iv) && strlen($iv) % 2 == 0) {return openssl_decrypt($crypted_string, $this->method, $this->key, 0, hex2bin($iv));}}return FALSE; // failed to decrypt}}
use \Chirp\Cryptor;$token = "The quick brown fox jumps over the lazy dog.";$encryption_key = 'CKXH2U9RPY3EFD70TLS1ZG4N8WQBOVI6AMJ5';$cryptor = new Cryptor($encryption_key);// 加密$crypted_token = $cryptor->encrypt($token);unset($token);// 解密$token = $cryptor->decrypt($crypted_token);
php对数字字符串加解密相关推荐
- android中使用jni对字符串加解密实现分析
android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...
- HJ29 字符串加解密
描述 1.对输入的字符串进行加解密,并输出. 2.加密方法为: 当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B:字母Z时则替换为a: 当内容是数字时则把该数 ...
- 华为机试HJ29: 字符串加解密
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 1.对输入的字符串进行加解密,并输出. 2.加密方法为: 当内容是英文字母时则用该英 ...
- RSA+AES数字信封加解密设计
登录认证.鉴权这些都做好了过后.就开始我们的加密设计了.这里采用了简化数字信封进行加密.首先客户端(浏览器)先请求一份RSA非对称密钥.如果我们采用了openresty或者有能力在nginx开发C模块 ...
- 华为OD机试题:字符串加解密
描述 对输入的字符串进行加解密,并输出. 加密方法为: 当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B:字母Z时则替换为a: 当内容是数字时则把该数字加1, ...
- JavaIO流加解密,AES对字符串加解密
加解密文件? 哈哈哈哈,当然是为了安全,自己的东西不像让别人看见. 1,学了JavaIO流的字节流的读取写入,便可实现. 加密原理: 把文件读取,然后,按某个特定的规则改变其字节写入一个新文件. 解密 ...
- sm2格式数字信封加解密详解
sm2格式数字信封 0.参考链接 密码行业标准化技术委员会http://www.gmbz.org.cn/main/bzlb.html SM2密码算法使用规范http://www.gmbz.org.cn ...
- C#常用字符串加解密方法封装
C#中常用的字符串加密.解密方法封装,包含只加密但不解密的方法.收藏起来备用. 1 //方法一 2 //须添加对System.Web的引用 3 //using System.Web.Security; ...
- java 数字信封_本地证书实现数字信封加解密demo-java
[实例简介] 提供获取加密证书接口.数字信封加密以及数字信封解密接口源码,IDEA编译,测试数据符合标准openssl,测试的时候要注意证书和私钥的存放路径 [实例截图] [核心代码] SealEnv ...
最新文章
- python中bool函数的用法_python3实战python函数每日一讲 - bool([x])
- Java描述设计模式(13):迭代器模式
- Ubuntu下设置环境变量的三种方法
- LightGBM大战XGBoost,谁将夺得桂冠?
- 深入入门正则表达式(java) - 1 - 入门基础
- C++20协程原理和应用
- 开始新的学习之旅--PHP开发学习--基础部分笔记
- Python出现‘ascii‘ codec can‘t encode characters...的解决方法
- 8、二叉树的下一个节点(Python)
- 八种点云聚类方法(一)— DBSCAN
- 如何批量修改文件后缀
- 施一公讲解如何提高阅读英语的能力
- 百度导航怎么不显示服务器,win7系统百度首页导航不见了怎么办
- php qcloud sdk weapp_qcloud/
- 关于kali出现乱码问题
- python3 绘制盖尔圆
- 常微分方程组之龙格-库塔法
- 如何选择适合你的兴趣爱好(四十二),风筝
- Linux下7za对rar文件解压失败问题
- python同花顺股票实时数据_web实时股票数据展示
热门文章
- (十八:2020.10.10)MICCAI 2020 追踪之论文纲要(译)<上>
- 昆明理工大学知道计算机答案,昆明理工大学 计算机基础教材参考答案(1-6章)
- 删除指定文件夹以及文件下的文件
- C# Lambda表达式含义及各种写法
- 协程爬取整站豆瓣网络
- 重磅:某国产IDE发布,称完全可替代 IntelliJ IDEA,由阿里头制作!​
- JS—正则:手机号3+4+4空格格式化
- 小白上手 为Kindle添加图书的五种方法
- 2020年有寓意的领证日期_2020领证吉日,这些特殊寓意的好日子不能错过
- Linux 磁盘管理-分区管理-磁盘修复-断电导致磁盘损坏【fsck】修复异常磁盘