标签:ctr 解密 方式 enc rsa iso and 老师 相关
最近在对接客户的CRM系统,获取令牌时,要用DES方式加密解密,由于之前没有搞错这种加密方式,经过请教了“百度”和“谷歌”两个老师后,结合了多篇文档内容后,终于实现了。
DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。
openssl_encrypt($data, $method, $password, $options, $iv)
参数说明:
$method 加密方法
$options 数据格式选项(可选)【选项有:】
openssl_decrypt($data, $method, $password, $options, $iv)
参数说明:
参数:
$data = '1234567887654321';//加密明文
$method = 'DES-ECB';//加密方法
$passwd = '12344321';//加密密钥
$options = 0;//数据格式选项(可选)
$iv = '';//加密初始化向量(可选)
加密:
``` $result = openssl_encrypt($data, $method, $passwd, $options); var_dump($result); ```结果:
``` string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg" ```解密
``` $result = ‘kQYOdswcm9I5elv2wdJucplqAgqDNqXg‘; var_dump(openssl_decrypt($result, $method, $passwd, 0)); ```结果:
``` string(16) "1234567887654321" ```加密
``` $result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA); var_dump($result); ```结果:
``` string(24) "?v???9z[???nr?j ?6??" ```我们可以看到结果是乱码的,这时我们需要base64一下
``` $result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA); var_dump(base64_encode($result)); ```这时结果是
``` string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg" ```解密
``` result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA); var_dump(openssl_decrypt($result, $method, $passwd,OPENSSL_RAW_DATA)); ```结果:
``` string(16) "1234567887654321" ```我们可以看到:默认填充方式与OPENSSL_RAW_DATA,这两种方式加密结果是一样的
看字面意思,是用0填充,但是测试并不起作用
加密
``` $result = openssl_encrypt($data, $method, $passwd, OPENSSL_ZERO_PADDING); var_dump($result); ```结果:
``` string(24) "kQYOdswcm9I5elv2wdJucg==" ```解密:
``` $result = openssl_encrypt($data, $method, $passwd, OPENSSL_ZERO_PADDING); var_dump(openssl_decrypt($result, $method, $passwd,OPENSSL_ZERO_PADDING)); ```结果:
``` string(16) "1234567887654321" ```加密
``` $str_padded = $data; if (strlen($str_padded) % 16) { $str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0"); } $result = openssl_encrypt($str_padded, $method, $passwd, OPENSSL_NO_PADDING); var_dump($result); echo ‘<br>‘; var_dump( base64_encode($result)); ```结果:
``` string(16) "?v???9z[???nr" string(24) "kQYOdswcm9I5elv2wdJucg==" ```我们可以看到结果是加密的乱码,需要用base64一下,就可以看到结果了
解密:
``` //加密begin $str_padded = $data; if (strlen($str_padded) % 16) { $str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0"); } $result = openssl_encrypt($str_padded, $method, $passwd, OPENSSL_NO_PADDING); //加密end //解密begin $str = base64_encode($result); $m = openssl_decrypt( base64_decode($str) , $method, $passwd, OPENSSL_NO_PADDING); var_dump( rtrim( rtrim( $m,chr(0) ), chr(7) ) ); //解密 end ```结果:
``` string(16) "1234567887654321" ```** 结尾要去除填充字符’0’和’a’。
‘a’是为了兼容用OPENSSL_RAW_DATA加密的结果。 **
原文地址:https://segmentfault.com/a/1190000016803710
标签:ctr 解密 方式 enc rsa iso and 老师 相关
原文地址:https://www.cnblogs.com/lalalagq/p/9964250.html