最近和别人做接口用到SOCKET TCP/IP方式

其中需要对账号和密码进行3DES加密

对方提供了一个加密比对的软件和JAVA的实现代码

并且给了我们一个长度为32位的密钥

这边需要用PHP来实现!

PHP  3des加密的密钥位24位!关于这个密钥长度的问题纠结了很久

最后被哥蒙对了!

32位长度如何转化为24位呢

我是这样做的

将32位的前16位取出来放到后面 这样32+16 = 48位

然后用

$key = pack('H48',$key)

正好是24位!

也就是16进制转化为字节流

这也是有依据的,这种叫着对称加密

当然加密的方式为cbc模式

cbc模式加密是需要一个向量来增加安全性的

看JAVA代码如下

IvParameterSpec iv = new IvParameterSpec(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 });

这样就看到JAVA中的向量是用字节数组表示的!

但是在PHP中该如何表示呢

当然需要先将此字节数组转化成16进制字符串

在php中就是

00 00 00 00 00 00 00 00(在实际运算中中间的空格要去掉)

如果JAVA的向量为new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }呢

那么在PHP中就是 01 02 03 04 05 06 07 08

然后再用PACK函数转化一下,如下:

$iv = pack('H*','0000000000000000')

好了 向量和密钥确定了,剩下的就是加密了

代码如下:

function en3DESEx($str){
$key = '56781234D56F012BCD5E701A3CDD670956781234D56F012B';//已经改变成48位
$key = pack('H48',$key);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
// $iv = pack('H*',"0102030405060708"); //like c# new byte[]{1,2,3,4,5,6,7,8}
$iv = pack('H*','0000000000000000');
mcrypt_generic_init($td, $key, $iv);
$encrypted_data = mcrypt_generic($td,$str );
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return bin2hex($encrypted_data); // 转化成16进制字符串
}
$str = '12345678'
echo en3DESEx($str); 结果
/**
* 明文:12345678
* 密文:b2a85cf088D9ff03
*/

而别人给我的软件加密的结果为:B2A85CF088D9FF03

正好将小写转化成大写字母就对了

附带解密函数

function de3DESEx($str){ // 注意 由于加密的时候转化成了16进制,所以解密的字符串也位16进制
$key = '56781234D56F012BCD5E701A3CDD670956781234D56F012B';
$key = pack('H48',$key);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
// $iv = pack('H*',"0102030405060708"); //like c# new byte[]{1,2,3,4,5,6,7,8}
$iv = pack('H*','0000000000000000');
mcrypt_generic_init($td, $key, $iv);
$encrypted_data = mdecrypt_generic($td, pack('H*',$str)); // 解密用的PHP自带函数
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $encrypted_data;
} // 然后神奇般的解密成功了!

总结!其实现在的很多语言已经很自能化了,一切的东西别人已经给你封装好了,该怎么用?

呵呵!已经要深刻的了解好业务,不然最后会是多么痛苦的领悟呀!

php 3des加密 兼容JAVA 多么痛的领悟呀的更多相关文章

  1. '增量赋值(augmented assignment)', 多么痛的领悟!

    '增量赋值(augmented assignment)', 多么痛的领悟! 深刻理解x += a 与 x = x + a 的不同: 按理说上面的两条语句是等价的, 功能上完全一样的. 之所以说不同, ...

  2. iOS 3DES加密 和 java 3DES 解密

    首先进入头文件: #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCryptor.h> #i ...

  3. js前端3des加密 后台java解密

    import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import java ...

  4. PHP实现DES/ECB/PKCS5Padding加密兼容Java SHA1PRNG算法

    在使用php调用java接口时,遇到了两边加密结果不一致的问题.经过沟通发现接口方使用了SHA1PRNG算法,对原密码计算后做为Des的加密Key. 因此在php中也需要先对原密码做相应计算才能保持结 ...

  5. 多么痛的领悟---关于RMB数据类型导致的元转分分转元的bug

    关于金额的数据类型,以及元转分分转元之间这种转换,以及元和分的比较,我相信很多人都踩过坑. 反正我是踩过. 而且,昨天和今天又重重的踩了两脚. 代付查询接口,支付中心给溢+响应的报文里,amount的 ...

  6. Bellon(多么痛的领悟)

    尼玛  我今天刚刚知道什么是负权回路 任意相连的无向图之间都是回路!!! 囧了一天了,算是看出来了,渣比 A====B 则A能到B且B能到A,这就是一个回路.

  7. 在IIS中部署前后端应用,多么痛的领悟!

    目前手上的Web项目是前后端分离的,所以有时也会倒腾Vue框架. 前后端应用最终以容器形态.在k8s中部署, 为此我搭建了基于Gitlab flow的Devops流程. 在Devops实践中,容器部署 ...

  8. JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的B ...

  9. C# Java 3DES加密解密 扩展及修正\0 问题

    注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...

随机推荐

  1. Sublime 必知必会(持续更新)

    1.格式化代码 Edit - Line - Reindent(中文路径则是:编辑 - 行 - 再次缩进) 2.分屏显示 view-layout-Columns:2(中文路径则是:查看 - 布局 - 列 ...

  2. CentOS 7 下 MySql5.7 主从配置

    演示用两台全新MySql服务器: mysql1:10.10.1.55 (主) mysql2:10.10.1.56 (从) 配置主从,步骤如下:   STEP 1:在mysql1上创建复制账号 repl ...

  3. Can't find the 'libpq-fe.h header when trying to install pg gem

    https://stackoverflow.com/questions/6040583/cant-find-the-libpq-fe-h-header-when-trying-to-install-p ...

  4. Django获取Header中的信息

    今天需要从header中获取一些信息,查了一些资料,需要注意一下几点: request.META.get("header key") 用于获取header的信息 注意的是heade ...

  5. PHP之string之addslashes()函数使用

    addslashes (PHP 4, PHP 5, PHP 7) addslashes - Quote string with slashes addslashes - 使用反斜线引用字符串 Desc ...

  6. Java reflect 反射 1

    1 反射的概述 反射含义:可以获取正在运行的Java对象. JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法; 这种动态 ...

  7. [Mysql 查询语句]——查询指定记录

    #比较 等于; 大于; 小于; 小于或等于; 大于或等于; 不等于; 排除掉; #指定范围查询 BETWEEN IN ; ; #指定集合查询 IN ,); ,); 集合元素可以是字符串类型 selec ...

  8. i.mx6 Android5.1.1 servicemanager本地服务

    接在之前的 i.mx6 Android5.1.1 初始化流程之init进程 i.mx6 Android5.1.1 初始化流程之init.rc解析 servicemanager是由init创建的本地服务 ...

  9. 开源代码ViewPageIndicator的使用

    1. 导入Android studio 使用SlidingMenu的方式导入Android studio不行,不知道为何,过会懂了再写上 2. 代码 activity_main.xml <?xm ...

  10. 数据库命令行操作语句 linux 详细

    1.连接数据库 命令: use <数据库名> 2.查看表的引擎类型等状态信息 SHOW TABLE STATUS [FROMdb_name] [LIKE 'pattern'] 3.当前数据 ...