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填充)的更多相关文章

  1. C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式

    ============================================== des   cbc  加密 zeropadding填充方式 ======================= ...

  2. javascript JS CryptoJS DES加解密CBC模式与C#DES加解密相同互通

    我们只知道不同的语言解密要相互通用,就需要遵循相同的加密方式,然而在具体做技术预研的时候,就发现会遇到很多问题,网上找的资料也是比较片面,所以我踩了坑,并且把解决方案和相关资料源码提供出来,给需要的朋 ...

  3. DES加解密 cbc模式 的简单讲解 && C++用openssl库来实现的注意事项

    DES cbc是基于数据块加密的.数据块的长度为8字节64bit.以数据块为单位循环加密,再拼接.每个数据块加密的秘钥一样,IV向量不同.第一个数据快所需的IV向量,需要我们提供,从第二个数据块开始, ...

  4. C# And Java 3DES加解密 ECB模式/PKCS7

    c#: /// <summary>     /// 完整     /// </summary>     public class TripleDESHelper1     { ...

  5. java 与 c# 3des 加解密

    java 与 c# 3des 加解密   主要差异如下: 1.  对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...

  6. 3DES加解密类

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace GT.C ...

  7. PHP版3DES加解密类

    <?php /** * * PHP版3DES加解密类 * * 可与java的3DES(DESede)加密方式兼容 * * @Author:蓝凤(ilanfeng.com) * * @versio ...

  8. 3DES加解密【示例】

    代码 /**  * 3DES加解密  */ public class DESedeUtils {     private static final String ALGORITHM_MD5 = &qu ...

  9. 3DES 加解密

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Comm ...

随机推荐

  1. SPRING CLOUD微服务DEMO-下篇

    目录 1 Hystix 1.1 简介 1.2 配置并测试 2. Feign 2.1 简介 2.2 使用Feign 2.3 负载均衡 2.4 Hystrix支持 2.5.请求压缩 3. Zuul网关 3 ...

  2. crontab 使用

    1. 安装,结构 yum install cronie 结构: * * * * * [分钟] [小时] [每月的某一天] [每年的某一月] [每周的某一天] 2.命令 1,添加或更新crontab中的 ...

  3. Maximum of lines in a DataBand

    Hello! I have a problem.I have a DataBand, but I need it to grow only up to 14 lines. If it is beyon ...

  4. git提交时,仓库是空的,本地有源码。

    应该打开cmd   归到项目路径 然后输入git push -u origin master -f 是把本地的项目强制推送到空的仓库 git init (在当前文件夹下初始化一个git仓库) git ...

  5. C++中的临时对象

    1,临时对象神秘在于不知不觉就请入程序当中,并且给程序带来了一定的问题: 2,下面的程序输出什么?为什么? #include <stdio.h> class Test { int mi; ...

  6. springboot 项目启动脚本

    springboot项目启动可通过下面的shell脚本启动. startup.sh app=order-service-rest.jar appout=logs/${app/.jar/.out} ap ...

  7. 北京邀请赛 B. Beautiful Garden

    题意:给你坐标和n个点,求最少移动的点使得n个点成等差数列 思路:既然要成等差数列,那么最起码有两个点是不动的,然后枚举这两个点中间的点的个数,近期水的要死,看了队友的代码做的 #include &l ...

  8. 定时任务crond介绍

    定时任务cornd crond介绍: crond是linux系统中用来定期(或周期性)执行命令或指定程序任务脚本的一种程序. 查看crontab帮助: [root@db01 ~]# crontab - ...

  9. django-celery beat报错 error pid

    最近在用django-celery添加定时任务,测试时启动过一次Beat,beat按理说是只能启动一个的但是不服务器都重启过了还是提示已有进程在运行. ERROR: Pidfile (celerybe ...

  10. XMPP即时通讯协议使用(十二)——基于xmpp搭建简单的局域网WebRTC

    创建HTML和JS ofwebrtc.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...