如何用Java进行3DES加密解
2013-09-12 10:55
260 查看
原文地址 : 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();需要留意的是,要使用DESede的Spec、Factory和Cipher才行事情还没完结,合作商给过来的除了密钥之外,还有一个IV向量。搜索了一下,发现有一个IvParameterSpec类,于是代码变成这样
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())));
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 IVECB是什么呢?我的代码完全没有写ECB什么的又上网搜索,结果把DES的来龙去脉都搞清楚了http://www.tropsoft.com/strongenc/des.htmECB是其中一种字串分割方式,除了DES以外,其他加密方式也会使用这种分割方式的,而Java默认产生的DES算法就是用ECB方法,ECB不需要向量,当然也就不支持向量了除了ECB,DES还支持CBC、CFB、OFB,而3DES只支持ECB和CBC两种http://www.tropsoft.com/strongenc/des3.htmCBC支持并且必须有向量,具体算法这里就不说了。合作商给的.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数据的解密难度
相关文章推荐
- 如何用Java进行3DES加密解
- 如何用Java进行3DES加密解密
- java对xml进行的DOM 解析以及如何对网站数据进行加密
- java中如何使用MD5进行加密
- 如何使用java进行sha1加密
- 如何对java的class类进行加密
- Android 使用OpenSSL进行3DES加密 c与java互通
- Java中如何进行加密和数字签名
- 如何使用CryptoJS配合Java进行AES加密和解密
- C#中可以与java进行互相转换的3des的加密和解密
- Java:如何使用Cipher类对字符串进行加密解密
- 如何使用Java对密码进行加密 Java Sah加密方式帮你实现加密
- Java进行3DES加密解密
- 如何对所有存储过程进行一次性的加密?(来自CSDN)
- java中使用MD5进行加密
- PHP进行3des加密
- java中使用MD5进行加密
- 如何对ConnectionString进行加密解码?
- Java 3DES 加密 解密 示例
- 如何利用Oracle自带的MD5对数据进行加密