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

本文共 2053 字,大约阅读时间需要 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才能保证通信。

转载于:https://www.cnblogs.com/AloneSword/p/3479389.html

你可能感兴趣的文章
HDU 5307 He is Flying (生成函数+FFT)
查看>>
PHP array_combine()
查看>>
浅析C\C++的动态内存管理
查看>>
Python 伪造数据的库:Faker
查看>>
《亿级用户下的新浪微博平台架构》阅读笔记
查看>>
nginx对nodejs服务器的http、https、ws、wss的配置
查看>>
短信中VB.NET编码PDU(一)
查看>>
easybuy项目总结_20180409
查看>>
JAVA学习笔记-异常机制
查看>>
ubunru12.10下安装Hadoop1.0.4
查看>>
极速理解设计模式系列【目录索引】
查看>>
.net 弹窗方式
查看>>
JavaScript中Element与Node的区别,children与childNodes的区别
查看>>
[POI2007]ATR-Tourist Attractions [TPLY]
查看>>
okhttp拦截器之RetryAndFollowUpInterceptor&BridgeInterceptor分析
查看>>
maven入门(上)
查看>>
Spring+hibernate事务详解
查看>>
MyBatic:查询语句
查看>>
[LeetCode-JAVA] Count Complete Tree Nodes
查看>>
6、SQL Server 数据查询
查看>>