最近和别人做接口用到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. 5 个 iOS 和 Android 最佳的开源自动化工具[转]

    自动化测试时下在产品测试上有着非常重要的作用.实现测试自动化有多种积极的方式,包括最大限度地减少测试执行时间:在关键的发布阶段,用更少的时间确保更大的覆盖范围:在产品开发阶段,可靠又重复性地运行以确保 ...

  2. spring boot快速入门 5: 事务管理

    事务管理: 新增两名女生: 第一步:创建 GirlRespository package com.payease.service; import com.payease.entity.Girl; im ...

  3. SpringSecurity自定义用户登录

    根据上一节的配置,默认在服务开启的时候会被要求自动的进行表单登陆.用到的用户名只能是一个固定的用户名user,它的密码是每次启动的时候服务器自动生成的.最常见的场景是我们的用户是从数据库中获取的. 1 ...

  4. js继承的实现(es5)

    js对面向对象的支持很弱,所以在ES6之前实现继承会绕比较多的弯(类似于对面向对象支持弱,然后强行拼凑面向对象的特性) es5中实现继承的几种方式,父类定义为Super function Super( ...

  5. solr7之solrJ的使用

    solr7的官网API介绍 网页翻译的不是很准确,只能了解个大概,基本能获取如下信息: 一.构建和运行SolrJ应用程序 对于用Maven构建的项目, pom.xml配置: <dependenc ...

  6. 有符号整数比较v.s.无符号整数比较

    本文尝试从汇编的角度给出有符号整数比较与无符号整数比较的区别所在. 在<深入理解计算机系统>(英文版第二版)一书中的Page#77,有下面一个练习题: 将上述示例代码写入foo1.c文件, ...

  7. Golang build命令解析

    go build,是我们非常常用的命令,它可以启动编译,把我们的包和相关的依赖编译成一个可执行的文件. usage: go build [-o output] [-i] [build flags] [ ...

  8. [转]asp.net权限认证:HTTP基本认证(http basic)

    本文转自:http://www.cnblogs.com/lanxiaoke/p/6353955.html HTTP基本认证示意图 HTTP基本认证,即http basic认证. 客户端向服务端发送一个 ...

  9. Linq中连接

    Linq中连接主要有组连接.内连接.左外连接.交叉连接四种.各个用法如下. 注:本文内容主要来自<Linq实战>,本例中用到的对象请见文章底部. 1. 组连接 组连接是与分组查询是一样的. ...

  10. Mysql中的分页处理

    先来说一下Mysql中limit的语法: --语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset --举例: selec ...