国际数据加密算法(IDEA)是[上海交通大学]教授来学嘉与瑞士学者James Massey联合提出的。它在1990年正式公布并在以后得到增强。这种算法是在[DES算法]的基础上发展出来的,类似于三重DES。发展IDEA也是因为感到[DES] 具有密钥太短等缺点。IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。
类似于[DES] ,IDEA算法也是一种数据块加密算法,它设计了一系列加密轮次,每轮加密都使用从完整的加密密钥中生成的一个子密钥。与DES的不同处在于,它采用软件实现和采用硬件实现同样快速。 由于IDEA是在美国之外提出并发展起来的,避开了美国法律上对[加密技术]的诸多限制,因此,有关IDEA算法和实现技术的书籍都可以自由出版和交流,可极大地促进IDEA的发展和完善。
目前IDEA在工程中已有大量应用实例,PGP(Pretty Good Privacy)就使用IDEA作为其分组加密算法;安全套接字层[SSL](Secure Socket Layer)也将IDEA包含在其加密算法库SSLRef中 新的标准已经删除IDEA支持;IDEA算法专利的所有者Ascom公司也推出了一系列基于IDEA算法的安全产品,包括:基于IDEA的Exchange安全插件、IDEA[加密芯片]、IDEA加密软件包等。IDEA算法的应用和研究正在不断走向成熟。
(1)工作模式 ECB (2) 填充模式 PKCS5Padding、PKCS7Padding、ISO10126Padding、ZeroBytePadding (3) 密钥长度 密钥长度128 (4) 算法实现
package lzf.cipher.bc;
import java.nio.charset.Charset;
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;
import org.bouncycastle.util.encoders.Hex;
/**
* @author Java小工匠
*/
public class BCIdeaUtils {
public static final String ALGORITHM = "IDEA";
public static final String CIPHER_ALGORITHM = "IDEA/ECB/ISO10126Padding";
// 获取 DES Key
public static byte[] getDesKey() {
try {
Security.addProvider(new BouncyCastleProvider());
// 1、创建密钥生成器
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM, "BC");
keyGenerator.init(128);
// 2、产生密钥
SecretKey secretKey = keyGenerator.generateKey();
// 3、获取密钥
byte[] key = secretKey.getEncoded();
return key;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// DES 解密
public static byte[] encryptIdea(byte[] data, byte[] key) {
try {
Security.addProvider(new BouncyCastleProvider());
SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);
// 加工作模式和填充方式
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] rsData = cipher.doFinal(data);
return rsData;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static byte[] decryptIdea(byte[] data, byte[] key) {
try {
Security.addProvider(new BouncyCastleProvider());
SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);
// 加工作模式和填充方式
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] rsData = cipher.doFinal(data);
return rsData;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
byte[] data = "java小工匠".getBytes(Charset.forName("UTF-8"));
byte[] key = getDesKey();
String hexKeyStr = Hex.toHexString(key);
System.out.println("加密密钥:" + hexKeyStr + ",length=" + hexKeyStr.length());
byte[] encryptData = encryptIdea(data, key);
System.out.println("加密数据:" + Hex.toHexString(encryptData));
byte[] decryptData = decryptIdea(encryptData, key);
System.out.println("解密数据:" + new String(decryptData));
}
}