zoukankan      html  css  js  c++  java
  • PHP 3DES 加解密(CBC模式,pkcs5padding填充)

    1、前言:项目中接入第三方支付遇到3DES加密,以前也没用过,搜了好多,都不适用,各种不对,后来自己结合搜到的终于弄正确了,检测地址:http://tool.chacuo.net/crypt3des。

    2、下面是类 适用(CBC加密模式,pkcs5padding填充

     代码:

     1 /**
     2 * @des 3DES加密算法,cbc模式,pkcs5Padding字符填充方式
     3 */
     4 
     5 class TDEA
     6 {
     7   /**
     8   * @param string $crypt 需要加密的字符串
     9   * @param string $key 加密使用的密钥
    10   * @param string $vi 加密使用的向量
    11   * @return string $crypt 加密后的字符串
    12   * @des 3DES加密
    13   */
    14   final static public function encrypt($input, $key, $iv, $base64 = true) {
    15     $size = 8;
    16     $input = self::pkcs5_pad($input, $size);
    17     $encryption_descriptor = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
    18     mcrypt_generic_init($encryption_descriptor, $key, $iv);
    19     $data = mcrypt_generic($encryption_descriptor, $input);
    20     mcrypt_generic_deinit($encryption_descriptor);
    21     mcrypt_module_close($encryption_descriptor);
    22     return base64_encode($data);
    23   }
    24   /**
    25   * @param string $crypt 需要解密的字符串
    26   * @param string $key 加密使用的密钥
    27   * @param string $vi 加密使用的向量
    28   * @return string $input 解密后的字符串
    29   * @des 3DES解密
    30   */
    31   final static public function decrypt($crypt, $key, $iv, $base64 = true) {
    32     $crypt = base64_decode($crypt);
    33     $encryption_descriptor = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
    34     mcrypt_generic_init($encryption_descriptor, $key, $iv);
    35     $decrypted_data = mdecrypt_generic($encryption_descriptor, $crypt);
    36     mcrypt_generic_deinit($encryption_descriptor);
    37     mcrypt_module_close($encryption_descriptor);
    38     $decrypted_data = self::pkcs5_unpad($decrypted_data);
    39     return rtrim($decrypted_data);
    40   }
    41 
    42   final static private function pkcs5_pad($text, $blocksize) {
    43     $pad = $blocksize - (strlen($text) % $blocksize);
    44     return $text . str_repeat(chr($pad), $pad);
    45   }
    46   final static private function pkcs5_unpad($text) {
    47     $pad = ord($text{strlen($text) - 1});
    48     if ($pad > strlen($text)){
    49       return false;
    50     }
    51     return substr($text, 0, -1 * $pad);
    52   }
    53 }
    54 
    55 
    56 调用测试
    57 
    58 $plaintext = "3DES加密测试";
    59 $key = "r0uScmDuH5FLO37AJV2FN72J";// 加密所需的密钥
    60 $iv = "1eX24DCe";// 初始化向量
    61 $ciphertext = TDEA::encrypt($plaintext, $key, $iv);//加密
    62 $plaintext2 = TDEA::decrypt($ciphertext, $key, $iv);//解密
    63 
    64 
    65 echo "<b>String:</b> $plaintext <br><br>";
    66 echo "<b>Encrypted:</b>";
    67 echo $ciphertext;
    68 echo"<br><br><b>Decrypt:</b> ";
    69 echo $plaintext2;

    检测地址:http://tool.chacuo.net/crypt3des

  • 相关阅读:
    自定义类型转换器之TypeConverter
    python测试工具nosetests
    算法练习之相同的树,对称二叉树
    算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组
    算法练习之报数, 最大子序和,最后一个单词的长度,加一,二进制求和
    java.sql.SQLException: Zero date value prohibited
    java打包小记
    修改jar的.class文件,并重新打包
    算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串
    解决GitHub访问速度慢的问题
  • 原文地址:https://www.cnblogs.com/yimingwang/p/7807880.html
Copyright © 2011-2022 走看看