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加密解密 /// ------------------------------------- ...
随机推荐
- Mac OS 10.12后Caps lock(大写键)无法使用的解决办法
▲打开设置中的键盘选项,并切换至输入源选项标签, ▲取消勾选“使用大写锁定键来回切换“美国英文””, ▲这时再按下Caps lock即可正常使用大小写切换. ▲Update:目前macOS 10.12 ...
- (转)C# 正则表达式
最近写爬虫时需要用到正则表达式,有段时间没有使用正则表达式现在渐渐感觉有些淡忘,现在使用还需要去查询一些资料.为了避免以后这样的情况,在此记录下正则表达式的一些基本使用方法附带小的实例.让以后在使用时 ...
- VS2015编译Boost1.64
一.下载并解压:boost1.64.0:http://www.boost.org/users/history/version_1_64_0.html 二.以管理员权限运行VS2015命令行工具 三.c ...
- 用Akka构建一个简易的分布式文件系统
本来初期打算用Hadoop 2,可是后来有限的服务器部署了Solr Cloud,各种站点,发现资源不够了,近10T的文件,已经几乎把服务器的磁盘全部用光.想来想去,由于目前架构基于Scala的,所以还 ...
- Android多媒体技术之视频播放
1.Android中视频播放方式 surfaceView+MediaPlayer,通过MediaPlayer来控制视频的播放.暂停.进度等: 使用VideoView 来播放,这个类其实也是继承了Sur ...
- linux mint 19 与windows时间不同步
首先确定时间无误 sudo apt-get install ntpdate sudo ntpdate time.windows.com 2 sudo hwclock --localtime --sys ...
- ThreadPoolExecutor 异常
通过execute提交的任务,能将该任务抛出的异常交给未捕获异常处理器处理,而通过submit提交的任务,无论是抛出的未检查异常还是已检查异常,都将被认为是任务返回状态的一部分.如果一个由submit ...
- mongo小记
进mongo mongo 先添加admin表的账号密码 . use admin . db.createUser( { user: "admin", pwd: "admin ...
- Http协议之Content-Length
前言 http协议是互联网中最重要的协议之一,虽然看上去很简单,但是实际中经常遇到问题,我们就已经遇到好几次了.有长连接相关的,有报文解析相关的.对http协议不能一知半解,必须透彻理解才行.所以就写 ...
- xml布局中include的使用
参考:http://blog.csdn.net/harvic880925/article/details/17263275 include_button1.xml <?xml version=& ...