php des cfb,PHP对称DES加密函数openssl_encrypt

一、DES介绍

今天刚好遇到这个,所以在百度一下这片文章是转载的,当然也有自己补充,DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。

跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。

常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。

加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

—————————————————————————————-

需要开启扩展’PHP openssl,最好更新扩展库,低版本的已经不安全了

1ad52d5a6d2f76cf9b4f96cb57599a7c.png

加密用到的方法:

openssl_encrypt($data, $method, $password, $options, $iv)

参数说明:

$data 要解密的数据

其他参数同加密方法

三、用法案例:

参数:

$data = '1234567887654321';//加密明文

$method = 'DES-ECB';//加密方法

$passwd = '12344321';//加密密钥

$options = 0;//数据格式选项(可选)

$iv = '';//加密初始化向量(可选)

加密的算法,获取

$a = openssl_get_cipher_methods(); //获取有那些加密算法

echo '

';

print_r($a);

默认填充方式:

加密:

$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"

(2)OPENSSL_RAW_DATA方式【会用PKCS#7进行补位】推荐使用

加密

$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,这两种方式加密结果是一样的

(3) OPENSSL_ZERO_PADDING方式

看字面意思,是用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"

(4) OPENSSL_NO_PADDING【不填充,需要手动填充】

在openssl_encrypt前加上填充过程

加密

$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 '
';

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加密的结果。 **

AEC加密:

//AEC加密

$data = 'Darren love you'; //要加密的内容

$key = uniqid(mt_rand(1000,9999),true); //获取唯一的key 密码

$method = 'AES-256-CFB'; //加密方式,可以通过 openssl_get_cipher_methods(); 获取

$vi = substr(md5($key),16,16); //获取唯一vi的值

$content = openssl_encrypt($data,$method,$key,OPENSSL_RAW_DATA,$vi); //开始加密

var_dump($key,$vi,$content);

echo '


';

//解密

$content = openssl_decrypt($content,$method,$key,OPENSSL_RAW_DATA,$vi); //解密

var_dump($content);

结果:

b13ce6d5f427532c78facbeba46f3043.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值