最近和别人做接口用到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. (转)基于OpenStack构建企业私有云(1)实验环境准备

    原文:https://www.unixhot.com/article/407 https://www.cnblogs.com/kevingrace/p/5707003.html-----完整部署Cen ...

  2. EasyNet开源项目计划

    EasyNet已经在github(https://github.com)开源了三个小项目: 1. patent query parser(https://github.com/easynet-cn/p ...

  3. Struts2 ongl内存结构

    valuestack是OgnlValueStack的实现,而OgnlValueStack是基于ValueStack的实现 valuestack的内存结构为: 里面主要的为:context和root r ...

  4. WPF中后台代码停止RepeatBehavior=RepeatBehavior.Forever的办法

    1.在使用Begin()方法启动动画的时候,要将isControlable设置成true,就是Begin方法的第二个参数  scanningStoryBoard.Begin(this,true);// ...

  5. [中英对照]The Art Of Reporting Bugs | 报bug的艺术

    前言:因为最近要给兄弟Team分享一下如何有效地报告bug, 故多做一做功课.下面给出一篇博客的中英文对照翻译. The Art Of Reporting Bugs | 报bug的艺术 My init ...

  6. 为什么各大网站都纷纷用起了https?哪些网站需要https(SSL证书)

    其实最近我也在易维信网站的开发组内讨论应用全站https事宜. 其原因非常简单. 因为不断接到用户投诉说网站上出现影响浏览体验的大面积广告. 可是网站平常只针对未登录用户在顶栏和底栏打两小条广告.而且 ...

  7. 747_Largest-Number-At-Least-Twice-of-Others

    目录 747_Largest-Number-At-Least-Twice-of-Others Description Solution Java solution Python solution 74 ...

  8. Rest分享

    分享提纲引言:微服务, 漂亮小姑娘,帅气小伙 这老头是个奇人,特别擅长抽象归纳和制造概念.特别是微服务这种新生的名词,都有一个特点:一解释就懂,一问就不知,一讨论就打架. REST是什么,是一个模式, ...

  9. Action、View、ActionResult、ViewResult、ContentResult

    可以,ASP.NET MVC的view和Controller不是严格的匹配的,一个Action Method可以引用多个view,而一个View也可以被一个Action方法使用如下代码所示:    1 ...

  10. tomcat的8088端口被占用

    打开Dos:windows->输入cmd(想必这个都会) 在黑窗口中输入指令:netstat -ano | findstr 8080       指令的意思是找出占用8080端口的进程pid 再 ...