3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
题记
最近工作中跨平台对接用到了加密算法,本以为加密算法会很简单,但寻觅许久发现大多轮子和对方加密结果并不一致,而且大多使用的是php5的扩展 mcryp
,在 php7 中早已经废弃了。于是乎有了这篇文章。
为什么要使用加密算法
数据的安全性越来越得以重视。举个例子说,保存在数据库中的用户密码并不是明文保存的,而是采用md5加密后存储,这样即使数据库被脱库,仍能保证用户密码安全。但是,md5是不可逆的,开发人员根本就不知道用户的密码到底是什么。有些时候,我们希望加密后存储的数据是可逆的,比如一些接口密钥,这样即使数据库被脱库,如果没有对应的解密方式,攻击者盗取的密钥也是不能使用的。
参考
代码
鉴于7.1废弃了mcrypt库,建议使用openssl_encrypt
和openssl_decrypt
进行加密解密
class ThreeDes {
//加密秘钥,
private $_key;
private $_iv;
public function __construct($key, $iv)
{
$this->_key = $key;
$this->_iv = $iv;
}
/**
* ------------------------------------------------------
* 加密
* @param $message
* author: SongTao
* ------------------------------------------------------
*/
public function encrypt($message)
{
$message_padded = $message;
if (strlen($message_padded) % 8) {
$message_padded = str_pad($message_padded,
strlen($message_padded) + 8 - strlen($message_padded) % 8, "\0");
}
$encrypted_mcrypt = mcrypt_encrypt(MCRYPT_3DES, $this->_key,
$message, MCRYPT_MODE_CBC, $this->_iv);
$encrypted_openssl = openssl_encrypt($message_padded, "DES-EDE3-CBC",
$this->_key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $this->_iv);
return bin2hex($encrypted_openssl);
// printf("%s => %s\n", bin2hex($message), bin2hex($encrypted_mcrypt));
// printf("%s => %s\n", bin2hex($message_padded), bin2hex($encrypted_openssl));
// die;
}
/**
* ------------------------------------------------------
* 解密
* @param $message
* @return string
* author: SongTao
* ------------------------------------------------------
*/
public function decrypt($message) {
$encrypted_openssl = pack("H*", $message);
$message_padded = openssl_decrypt($encrypted_openssl, "DES-EDE3-CBC",
$this->_key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $this->_iv);
$message_padded = rtrim(rtrim($message_padded, chr(0)), chr(7));
return $message_padded;
}
}