php 3des加密 兼容JAVA 多么痛的领悟呀
最近和别人做接口用到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 多么痛的领悟呀的更多相关文章
- '增量赋值(augmented assignment)', 多么痛的领悟!
'增量赋值(augmented assignment)', 多么痛的领悟! 深刻理解x += a 与 x = x + a 的不同: 按理说上面的两条语句是等价的, 功能上完全一样的. 之所以说不同, ...
- iOS 3DES加密 和 java 3DES 解密
首先进入头文件: #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCryptor.h> #i ...
- js前端3des加密 后台java解密
import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import java ...
- PHP实现DES/ECB/PKCS5Padding加密兼容Java SHA1PRNG算法
在使用php调用java接口时,遇到了两边加密结果不一致的问题.经过沟通发现接口方使用了SHA1PRNG算法,对原密码计算后做为Des的加密Key. 因此在php中也需要先对原密码做相应计算才能保持结 ...
- 多么痛的领悟---关于RMB数据类型导致的元转分分转元的bug
关于金额的数据类型,以及元转分分转元之间这种转换,以及元和分的比较,我相信很多人都踩过坑. 反正我是踩过. 而且,昨天和今天又重重的踩了两脚. 代付查询接口,支付中心给溢+响应的报文里,amount的 ...
- Bellon(多么痛的领悟)
尼玛 我今天刚刚知道什么是负权回路 任意相连的无向图之间都是回路!!! 囧了一天了,算是看出来了,渣比 A====B 则A能到B且B能到A,这就是一个回路.
- 在IIS中部署前后端应用,多么痛的领悟!
目前手上的Web项目是前后端分离的,所以有时也会倒腾Vue框架. 前后端应用最终以容器形态.在k8s中部署, 为此我搭建了基于Gitlab flow的Devops流程. 在Devops实践中,容器部署 ...
- JAVA和C# 3DES加密解密
最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的B ...
- C# Java 3DES加密解密 扩展及修正\0 问题
注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...
随机推荐
- sql在insert时判断有无唯一性冲突
sql在insert时判断有无唯一性冲突,存在相同主键或唯一索引,则不创建 INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'fi ...
- Linux-socket使用
socket 产生的原因 进程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX ...
- Leetcode 337. House Robber III
337. House Robber III Total Accepted: 18475 Total Submissions: 47725 Difficulty: Medium The thief ha ...
- Python基础(10) - 异常
Python 异常:程序出现了错误而在正常控制流以外采取的行为 Python中常见的异常: 1. NameError:尝试访问一个未声明的变量 >>> something Trace ...
- 第二章:第2章PHP基础语法
一. 基本的PHP语法如下: 1.PHP脚本可以放在文档中的任何位置,PHP脚本以<?php开始,以?>结束 <?php //PHP代码 ?> 2.php文件的默认文件扩展 ...
- (一)JNI基本概念
1. 基本概念: 首先,注意:C和C++在调用JNI时候方法是不一样的 注意看下面两个的区别: C++ #include <jni.h> #include <string> e ...
- C#通过XML导出Excel
最近IOS项目中有手机生成Excel,让我想起了之前做C#时做的生成Excel的,之前都放在空间日志中,今天把它弄到博客中分享一下
- [转]log4net 发布到生产环境不写日志的解决方法--使用 NLog日志
本文转自:http://www.cnblogs.com/weiweictgu/p/5848805.html 1.升级到log4net的最新版 PM下执行 Install-Package log4net ...
- jquery对象与dom对象之间互相转换的方法
本文主要讲述jquery对象和js里的dom对象之间互相转换的方法,使jquery对象可以直接使用js里的方法,或js里的dom对象使用jquery里的方法. jquery对象和dom对象是不一样的, ...
- jquery中 dom对象与jQuery对象相互转换
var jq = $(dom对象);//额 再补充点吧好记. $是jquery的别名.这一句等价于 var jq = jQuery(dom对象); 反之. dom对象 = jq[0]; //不写那么长 ...