转于:http://blog.csdn.net/alonesword/article/details/11595661
---------------------------------------------------------------------------------------
最近一个合作商提出使用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数据的解密难度
相关推荐
本篇文章将详细探讨Java环境下如何实现3DES加密算法,并介绍相关知识点。 首先,让我们了解3DES的工作原理。3DES是对原始DES算法的扩展,它通过执行三次加密过程来提高安全性。简而言之,3DES分为两种模式:EDE...
Java 中的 3DES 加密解密示例(封装 byte 数组和 16 进制字符串互转) 在 Java 中,3DES 加密是一种常用的加密算法,它可以将明文数据转换为密文数据,以保护数据的安全性。在本示例中,我们将展示如何使用 3DES ...
Java 3des加密算法ECB模式,亲测完美通过。目前网上的大部分算法都通不过或者加进Base64之类的,还要不下载其它jar包。而代码使用时直接下载运行,无须配置和下载额外的jar包 ,只需换上自己的密钥和待加密的数据...
在Java中实现3DES加密和解密涉及到以下几个关键点: 1. **密钥生成**:在Java中,你可以使用`java.security.KeyGenerator`类来生成3DES密钥。首先需要实例化一个`KeyGenerator`对象,然后调用`init()`方法初始化它...
3des加密 java
对称加密算法用来对敏感数据等信息进行加密,常用的算法包括 DES、3DES、AES 等。非对称加密算法采用加密钥匙(公钥)和解密钥匙(私钥),常用的算法包括 RSA、DSA、ECC 等。 在选择加密算法时,需要根据实际情况...
以上就是关于"java_3des加密源码"的相关知识点,这个源码文件应该包含了实现3DES加密和解密功能的核心逻辑,对于理解和使用3DES在Java中进行数据保护非常有帮助。在实际应用中,还需要考虑密钥管理、错误处理和安全...
Java DES加密是一种在Java编程环境中实现的对称加密算法,主要用来保护数据的安全性。DES(Data Encryption Standard)是早期广泛使用的一种加密标准,虽然现在已经被更安全的AES(Advanced Encryption Standard)所...
本篇将详细介绍如何在网页前端使用JavaScript进行3DES加密,并在后端Java环境中进行解密。 一、3DES加密原理 3DES是DES的加强版,它使用了3个不同的56位密钥,通过3次独立的DES加密过程来提高安全性。具体流程如下...
本程序是java语言实现的DES加密算法的实例。
以下是一个简单的3DES加密和解密的Java代码示例: ```java import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java...
主要介绍了使用java自带des加密算法实现文件加密和字符串加密的示例,需要的朋友可以参考下
下面将详细阐述DES加密解密的基本原理、Java和JavaScript的实现方式以及如何在两者之间进行互操作。 1. **DES加密算法**: DES是一种分组密码,使用64位的数据块和56位的密钥进行操作。它通过一系列复杂的数学变换...
Java写的DES的一个类”表明了这个压缩包包含两个部分:一个是使用Delphi编程语言编写的用于执行DES(Data Encryption Standard)加密和解密的小程序,另一个是用Java实现的DES加密类。DES是一种广泛使用的对称加密...
java 3des加密、解密工具类 java的3DES加密/解密
在使用这些资源时,按照说明进行操作,可以深入学习Java中的3DES加密和字符串转换技术。 学习这些内容对于开发安全的应用程序至关重要,因为数据加密可以帮助保护敏感信息,而字符串转换则是处理用户输入和系统输出...
在Java中实现DES加密,我们可以按照以下步骤进行。 首先,让我们理解DES算法的基本原理。DES是一种分组密码,它将明文数据分为64位的数据块进行处理。但是,实际的DES算法只使用了56位的密钥,因为其中8位是奇偶...
3. **JAVA实现DES加密解密** - **javax.crypto命名包**:JAVA中使用`javax.crypto.Cipher`类配合`DESKeySpec`和`SecretKeyFactory`实现DES加密解密。首先需要创建`DESKeySpec`对象,然后通过`SecretKeyFactory`生成...
在一项具体项目中,开发者需要通过Java和C++两种语言实现DES加密功能,并确保两者的加密结果完全相同以便于进行后续的数据交换。但是,在调试过程中发现,即使使用相同的明文和密钥,Java和C++生成的加密结果也不...
总的来说,通过Java实现3DES加密解密,我们需要理解加密算法的基本原理,熟悉Java的相关加密库,并掌握如何生成和使用密钥。在实际开发中,确保数据的安全性至关重要,因此正确地使用加密技术是每个IT专业人员必备的...