1、前言:项目中接入第三方支付遇到3DES加密,以前也没用过,搜了好多,都不适用,各种不对,后来自己结合搜到的终于弄正确了,检测地址:http://tool.chacuo.net/crypt3des。
2、下面是类 适用(CBC加密模式,pkcs5padding填充)
代码:
/**
* @des 3DES加密算法,cbc模式,pkcs5Padding字符填充方式
*/
class TDEA
{
??? /**
???? * @param ?string $crypt 需要加密的字符串
???? * @param ?string $key ??加密使用的密钥
???? * @param ?string $vi ???加密使用的向量
???? * @return string $crypt 加密后的字符串
???? * @des 3DES加密
???? */
??? final static public function encrypt($input, $key, $iv, $base64 = true) {
??????? $size = 8;
??????? $input = self::pkcs5_pad($input, $size);
??????? $encryption_descriptor = mcrypt_module_open(MCRYPT_3DES, ‘‘, ‘cbc‘, ‘‘);
??????? mcrypt_generic_init($encryption_descriptor, $key, $iv);
??????? $data = mcrypt_generic($encryption_descriptor, $input);
??????? mcrypt_generic_deinit($encryption_descriptor);
??????? mcrypt_module_close($encryption_descriptor);
??????? return base64_encode($data);
??? }
??? /**
???? * @param ?string $crypt 需要解密的字符串
???? * @param ?string $key ??加密使用的密钥
???? * @param ?string $vi ???加密使用的向量
???? * @return string $input 解密后的字符串
???? * @des 3DES解密
???? */
??? final static public function decrypt($crypt, $key, $iv, $base64 = true) {
??????? $crypt = base64_decode($crypt);
??????? $encryption_descriptor = mcrypt_module_open(MCRYPT_3DES, ‘‘, ‘cbc‘, ‘‘);
??????? mcrypt_generic_init($encryption_descriptor, $key, $iv);
??????? $decrypted_data = mdecrypt_generic($encryption_descriptor, $crypt);
??????? mcrypt_generic_deinit($encryption_descriptor);
??????? mcrypt_module_close($encryption_descriptor);
??????? $decrypted_data = self::pkcs5_unpad($decrypted_data);
??????? return rtrim($decrypted_data);
??? }
??? final static private function pkcs5_pad($text, $blocksize) {
??????? $pad = $blocksize - (strlen($text) % $blocksize);
??????? return $text . str_repeat(chr($pad), $pad);
??? }
??? final static private function pkcs5_unpad($text) {
??????? $pad = ord($text{strlen($text) - 1});
??????? if ($pad > strlen($text)){
??????????? return false;
??????? }
??????? return substr($text, 0, -1 * $pad);
??? }
}
调用测试
$plaintext = "3DES加密测试";
$key = "r0uScmDuH5FLO37AJV2FN72J";// 加密所需的密钥
$iv = "1eX24DCe";// 初始化向量
$ciphertext = TDEA::encrypt($plaintext, $key, $iv);//加密
$plaintext2 = TDEA::decrypt($ciphertext, $key, $iv);//解密
echo "<b>String:</b> $plaintext <br><br>";
echo "<b>Encrypted:</b>";
echo $ciphertext;
echo"<br><br><b>Decrypt:</b> ";
echo $plaintext2;
检测地址:http://tool.chacuo.net/crypt3des
PHP 3DES 加解密(CBC模式,pkcs5padding填充)
原文地址:http://www.cnblogs.com/yimingwang/p/7807880.html