如何用Java进行3DES加密解

原文地址 : http://weavesky.com/2008/01/05/java-3des/

最近一个合作商提出使用3DES交换数据,本来他们有现成的代码,可惜只有.net版本,我们的服务器都是Linux,而且应用都是Java。于是对照他们提供的代码改了一个Java的版本出来,主要是不熟悉3DES,折腾了一天,终于搞定。

所谓3DES,就是把DES做三次,当然不是简单地DES DES DES就行了,中途有些特定的排列。这个我可不关心,呵呵,我的目的是使用它。

在网上搜索了一下3DES,找到很少资料。经过朋友介绍,找到GNU Crypto和Bouncy Castle两个Java扩充包,里面应该有3DES的实现吧。

从GNU Crypto入手,找到一个TripleDES的实现类,发现原来3DES还有一个名字叫DESede,在网上搜索TripleDES和DESede,呵呵,终于发现更多的资料了。

Java的安全API始终那么难用,先创建一个cipher看看算法在不在吧

Cipher cipher = Cipher.getInstance("DESede");

如果没有抛异常的话,就证明这个算法是有效的

突然想看看JDK有没有内置DESede,于是撇开Crypto,直接测试,发现可以正确运行。在jce.jar里面找到相关的类,JDK内置了。

于是直接用DES的代码来改&测试,最后代码变成这样

SecureRandom sr = new SecureRandom();
DESedeKeySpec dks = new DESedeKeySpec(PASSWORD_CRYPT_KEY.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return new String(Hex.encodeHex(cipher.doFinal(str.getBytes())));

需要留意的是,要使用DESede的Spec、Factory和Cipher才行

事情还没完结,合作商给过来的除了密钥之外,还有一个IV向量。搜索了一下,发现有一个IvParameterSpec类,于是代码变成这样

SecureRandom sr = new SecureRandom();
DESedeKeySpec dks = new DESedeKeySpec(PASSWORD_CRYPT_KEY.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
IvParameterSpec iv = new IvParameterSpec(PASSWORD_IV.getBytes());
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, securekey, iv, sr);
return new String(Hex.encodeHex(cipher.doFinal(str.getBytes())));

但是,运行报错了

java.security.InvalidAlgorithmParameterException: ECB mode cannot use IV

ECB是什么呢?我的代码完全没有写ECB什么的

又上网搜索,结果把DES的来龙去脉都搞清楚了

http://www.tropsoft.com/strongenc/des.htm

ECB是其中一种字串分割方式,除了DES以外,其他加密方式也会使用这种分割方式的,而Java默认产生的DES算法就是用ECB方法,ECB不需要向量,当然也就不支持向量了

除了ECB,DES还支持CBC、CFB、OFB,而3DES只支持ECB和CBC两种

http://www.tropsoft.com/strongenc/des3.htm

CBC支持并且必须有向量,具体算法这里就不说了。合作商给的.net代码没有声明CBC模式,似乎是.net默认的方式就是CBC的

于是把模式改成CBC

Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");

成功运行了

后话:

搜索的过程中,找到一个不错的讨论

http://www.lslnet.com/linux/dosc1/21/linux-197579.htm 在CBC(不光是DES算法)模式下,iv通过随机数(或伪随机)机制产生是一种比较常见的方法。iv的作用主要是用于产生密文的第一个block,以使最终生成的密文产生差异(明文相同的情况下),使密码攻击变得更为困难,除此之外iv并无其它用途。因此iv通过随机方式产生是一种十分简便、有效的途径。此外,在IPsec中采用了DES-CBC作为缺省的加密方式,其使用的iv是通讯包的时间戳。从原理上来说,这与随机数机制并无二致。

看来,向量的作用其实就是salt

最大的好处是,可以令到即使相同的明文,相同的密钥,能产生不同的密文

例如,我们用DES方式在数据保存用户密码的时候,可以另外增加一列,把向量同时保存下来,并且每次用不同的向量。这样的好处是,即使两个用户的密码是一样的,数据库保存的密文,也会不一样,就能降低猜测的可能性

另外一种用法,就是类似IPsec的做法,两部主机互传数据,保证两部机的时钟同步的前提下(可以取样到分钟或更高的单位避免偏差),用时钟的变化值作为向量,就能增加被sniffer数据的解密难度

时间: 2025-01-01 00:25:29

如何用Java进行3DES加密解的相关文章

[J2SE]Java中3DES加密解密调用示例_JSP编程

jce.jar security/US_export_policy.jar security/local_policy.jar ext/sunjce_provider.jar Java运行时会自动加载这些包,因此对于带main函数的应用程序不需要设置到CLASSPATH环境变量中.对于WEB应用,不需要把这些包加到WEB-INF/lib目录下. 以下是java中调用sun公司提供的3DES加密解密算法的样本代码: 复制代码 代码如下: /*字符串 DESede(3DES) 加密*/ import

Java进行3DES加密解密

package com.shanhy.tools.packers; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * 3DES加密 * * @author SHANHY(365384722@QQ.COM) * @date 2015-8-18 */ public class Th

请问如何用java编写wordPress加密方式?

问题描述 本小菜完全不懂php,现在想通过java去访问已经存在的mysql数据库,里面存有一些php开源框架wordpress的用户数据,现在想用java实现登录功能,请问如何用java去编写密码的加密方式,请各位大神支招,最好是能给我一段现成的代码,以下为wordpress密码的加密方式http://www.tuicool.com/articles/ENrqIz. 解决方案 解决方案二:自己先顶一个...大神们快来呀.解决方案三:同问,如何用java去编写wodpress密码的加密方式?请大

【推荐】JAVA基础◆浅谈3DES加密解密

浅谈3DES加密解密   (注:本文不深入探讨3DES的加密原理,只着重说明在Java中使用3DES加密解密以及常见问题)       从数据安全谈起       当你使用网银时,是否担心你的银行卡会被盗用?     当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露?     作为开发者,编写安全的代码比编写优雅的代码更重要,因为安全是一切应用之根本!为了确保数据不被侵犯,数据加密/解密技术运用而生.    --摘录自<Java加密解密的艺术>       所以为了确保数据传输和数据存储的

如何用给定密钥进行3DES加密

问题描述 如何用给定密钥进行3DES加密 最近在研究3DES加密的问题,在网上找了一下基本都是http://www.cnblogs.com/mailingfeng/archive/2011/07/29/2120507.html这样的一段代码,我想问的是如果规定了一个字符串要用给定的密钥如:abcdabcd去加密,要怎么做?能不能贴一点代码参考一下? 解决方案 我现在做给一个24个字节的字符串加密,密钥是abcdabcd,加密后转为16进制字符串长度为48个字节,请问怎么实现? 解决方案二: 加密

flash的加密过程如何用java实现加密解密

问题描述 flash的加密过程如何用java实现加密解密 解决方案 flash快完了,还是学学HTML5吧!

请教:C#实现的AES加密,如何用java实现!

问题描述 下面这段是用C#做的AES加密,请教各位大神如何用java实现,谢谢!usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Text;usingSystem.Security.Cryptography;namespaceAES加密解密{///<summary>///AES加密解密类///</summ

Java软件如何加密

Java软件如何加密 [导读] 本文拟针对Java软件的加密保护方法,其中综合运用了多种加密技术,抗破解强度高:使用纯软件保护技术,成本低. Java软件由于Java语言面向对象和编译成中间码执行的特点,其在抗反编译和反盗版方面显得尤其脆弱,为此,我们针对Java软件的特点,综合运用各种加密方法,探索设计出一个实用型Java软件加密保护方法. 一.Java软件加密基本思路 对于应用软件的保护笔者从两个方面进行考虑,第一是阻止盗版使用软件,第二是阻止竞争对手对软件反编译,即阻止对软件的逆向工程.

关于3DES加密,直接上代码求指点

问题描述 关于3DES加密,直接上代码求指点 public static byte[] encryptMode(byte[] keybyte, byte[] src){ try { // SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);; String deskey = "abcdabcd"; Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.ENCRYP