7.5.2 实现

Java 6没有提供IDEA算法的相应实现,若需要使用该算法我们可以通过Bouncy Castle来完成。Bouncy Castle不仅提供了IDEA算法实现,包括其他Java 6未能支持的对称加密算法也可通过Bouncy Castele实现,如AES候选算法Rijndael、Serpent和Twofish等。本文以IDEA算法实现为例,读者朋友可参照其他算法的实现,如Rijndael、Serpent和Twofish等。

有关IDEA算法的Bouncy Castle实现细节如表7-4所示。

figure_0245_0057

IDEA算法的实现需要通过Bouncy Castle来完成,参考如下代码:


import java.security.Security;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

//省略

//加入BouncyCastleProvider支持

Security.addProvider(new BouncyCastleProvider());


本节代码实现对于其他Bouncy Castle支持的算法实现有代表性意义,实现如代码清单7-7所示。

代码清单7-7 IDEA算法实现


import java.security.Key;

import java.security.Security;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

/**

*IDEA安全编码组件

*@author梁栋

*@version 1.0

*@since 1.0

*/

public abstract class IDEACoder{

/**

*密钥算法

*/

public static final String KEY_ALGORITHM="IDEA";

/**

*加密/解密算法/工作模式/填充方式

*/

public static final String CIPHER_ALGORITHM="IDEA/ECB/ISO10126Padding";

/**

*转换密钥

*@param key二进制密钥

*@return Key密钥

*@throws Exception

*/

private static Key toKey(byte[]key)throws Exception{

//生成秘密密钥

SecretKey secretKey=new SecretKeySpec(key, KEY_ALGORITHM);

return secretKey;

}

/**

*解密

*@param data待解密数据

*@param key密钥

*@return byte[]解密数据

*@throws Exception

*/

public static byte[]decrypt(byte[]data, byte[]key)throws Exception{

//加入BouncyCastleProvider支持

Security.addProvider(new BouncyCastleProvider());

//还原密钥

Key k=toKey(key);

//实例化

Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);

//初始化,设置为解密模式

cipher.init(Cipher.DECRYPT_MODE, k);

//执行操作

return cipher.doFinal(data);

}

/**

*加密

*@param data待加密数据

*@param key密钥

*@return byte[]加密数据

*@throws Exception

*/

public static byte[]encrypt(byte[]data, byte[]key)throws Exception{

//加入BouncyCastleProvider支持

Security.addProvider(new BouncyCastleProvider());

//还原密钥

Key k=toKey(key);

//实例化

Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);

//初始化,设置为加密模式

cipher.init(Cipher.ENCRYPT_MODE, k);

//执行操作

return cipher.doFinal(data);

}

/**

*生成密钥<br>

*@return byte[]二进制密钥

*@throws Exception

*/

public static byte[]initKey()throws Exception{

//加入BouncyCastleProvider支持

Security.addProvider(new BouncyCastleProvider());

//实例化

KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);

//初始化

kg.init(128);

//生成秘密密钥

SecretKey secretKey=kg.generateKey();

//获得密钥的二进制编码形式

return secretKey.getEncoded();

}

}


IDEA算法本身也可以通过Bouncy Castle的API来实现,甚至包括其他Java 6未能支持的算法也可以通过Bouncy Castle的API来实现,包括Serpent和Twofish等。但是,如果这样做就跳出了JCE框架,增加了学习难度。既然JCE框架给我们提供了便捷灵活的第三方加密算法调用方式,我们为什么不能加以运用呢?

对于上述代码的测试如代码清单7-8所示。

代码清单7-8 IDEA算法实现测试用例


import static org.junit.Assert.*;

import org.apache.commons.codec.binary.Base64;

import org.junit.Test;

/**

*IDEA安全编码组件校验

*@author梁栋

*@version 1.0

*/

public class IDEACoderTest{

/**

*测试

*@throws Exception

*/

@Test

public final void test()throws Exception{

String inputStr="IDEA";

byte[]inputData=inputStr.getBytes();

System.err.println("原文:\t"+inputStr);

//初始化密钥

byte[]key=IDEACoder.initKey();

System.err.println("密钥:\t"+Base64.encodeBase64String(key));

//加密

inputData=IDEACoder.encrypt(inputData, key);

System.err.println("加密后:\t"+Base64.encodeBase64String(inputData));

//解密

byte[]outputData=IDEACoder.decrypt(inputData, key);

String outputStr=new String(outputData);

System.err.println("解密后:\t"+outputStr);

//校验

assertEquals(inputStr, outputStr);

}

}


控制台输出信息如下所示:


原文:IDEA

密钥:W1a1IFCKIbXKdnejfT5b2A==

加密后:er43StU2Txk=

解密后:IDEA