博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中3DES加密解密与其他语言(如C/C++)通信
阅读量:5890 次
发布时间:2019-06-19

本文共 1999 字,大约阅读时间需要 6 分钟。

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:
内部邀请码:
C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。 

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,

其具体实现如下:

设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,

3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1((EK2(Dk3(C)))
       K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位。当然,只用Java语言编写程序进行3DES的加密解密不用考虑任何问题,因为加密和解密是逆向过程,用的model和padding都是相同的,考虑到Java与其他语言通信时,就必须两种语言的model和padding是相同的才可以。

从一下的说明可以看出这一点:

 

使用cipher可以很容易的实现3des加密,但是跟其他平台开发的3des加密对接来说,通常会有一些问题。基本的程序如下: 

public static byte[] desEncrypt(String message, String key) throws Exception { Cipher cipher = Cipher.getInstance("DESede"); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return cipher.doFinal(message.getBytes("UTF-8"));

 

 

我们跟其他平台对接发现对同样输入加密以后结果不同,看看jdk的文档,有如下描述: 

A transformation is a string that describes the operation (or set of operations) to be performed on the given input, to produce some output.

A transformation is of the form:
•"algorithm/mode/padding" or •"algorithm"
(in the latter case, provider-specific default values for the mode and padding scheme are used).

根据前面的代码,我们已经选择了正确的算法,那么加密不同的原因应该就是mode和padding了。 

he SunJCE provider uses ECB as the default mode, and PKCS5Padding as the default padding scheme for DES, DES-EDE and Blowfish ciphers. This means that in the case of the SunJCE provider,

Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");

 

and

Cipher c1 = Cipher.getInstance("DES");

 

are equivalent statements.

 

对于其他语言开发的3des,一定要采用相同的mode和padding才能保证通信。

转载地址:http://yxysx.baihongyu.com/

你可能感兴趣的文章
AWS的十年发展之路-永远前行
查看>>
hibernate 锁机制
查看>>
#######keepdalived+lvs################
查看>>
eclipse错误日志Error Log
查看>>
基于db-unifier的一个简单示例
查看>>
“类” 创造器
查看>>
Bad Push-让人恍然大悟的14种错误推送方式
查看>>
Windows 平台的 Git 图形界面客户端
查看>>
我的友情链接
查看>>
保存点
查看>>
centos安装pil,windows64位pil,及导入字库报错问题
查看>>
我的友情链接
查看>>
nginx 开启压缩
查看>>
h5是啥
查看>>
Linux时间更新
查看>>
让musql数据库支持表情存入
查看>>
SpringMVC helloworld (xml版本)
查看>>
PHP与Memcache集群
查看>>
win7下Vmware VSphere Web Client是英文的修改方法
查看>>
CentOS6.3搭建Samba服务器
查看>>