IDEA算法
- 1. 算法简述
- 2.模型分析
- 3. 代码实现
-
- 3.1 代码实现
- 3.2 测试代码
- 3.3 运行结果
1. 算法简述
IDEA算法早于AES算法作为DES算法的可选替代算法,IDEA没有在DES算法基础上做修改,而是另辟溪径寻求突破解决方案。
IDEA算法使用长度128位的密钥,数据块大小为64位。IDEA数据强加密算法,破解难度大。
IDEA算法是目前电子邮件加密算法之一。
2.模型分析
IDEA算法模型和对称加密算法模型一致
3. 代码实现
Java中没有提供IDEA算法实现,但在Bouncy Castle中提供了IDEA算法实现,IDEA算法在Bouncy Castle中具体实现细节如下:
算法 | 密钥长度 | 默认密钥长度 | 工作模式 | 填充方式 | 备注 |
---|---|---|---|---|---|
IDEA | 128 | 128 | ECB | PKCS5Padding、 PKCS7Padding、ISO10126Padding、ZeroBytePadding | Bouncy Castle实现 |
3.1 代码实现
基于Android7.0单元测试的IDEA实现
package com.calvin.android.demo2.secrity;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* Author:cl
* Email:[email protected]
* Date:20-10-20
*/
public 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, new BouncyCastleProvider());
//初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, k);
//执行数据解密
return cipher.doFinal(data);
}
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, new BouncyCastleProvider());
//初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);
//执行数据加密
return cipher.doFinal(data);
}
public static byte[] initKey() throws Exception {
//加入BouncyCastleProvider支持
//实例化
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM,new BouncyCastleProvider());
//初始化
kg.init(128);
//生成秘密密钥
SecretKey secretKey = kg.generateKey();
//获得密钥的二进制编码形式
return secretKey.getEncoded();
}
}
3.2 测试代码
@Test
public void IDEATest() throws Exception{
String inputStr = "IDEA加密解密算法";
byte[] inputData = inputStr.getBytes();
System.out.println("原文:\t "+inputStr);
//初始化密钥
byte[] key = IDEACoder.initKey();
System.out.println("密钥:\t "+ Base64.encodeToString(key, Base64.DEFAULT));
//加密
inputData = IDEACoder.encrypt(inputData, key);
System.out.println("加密后:\t "+Base64.encodeToString(inputData, Base64.DEFAULT));
//解密
byte[] outputData = IDEACoder.decrypt(inputData, key);
String outputStr = new String(outputData);
System.out.println("解密后:\t "+outputStr);
//校验
assertEquals(inputStr, outputStr);
}
3.3 运行结果
2020-10-20 12:21:06.571 7220-7238/com.calvin.android.demo2 I/System.out: 原文: IDEA加密解密算法
2020-10-20 12:21:06.958 7220-7238/com.calvin.android.demo2 I/System.out: 密钥: 83ecS3WoqlJxj48+YLgBnw==
2020-10-20 12:21:07.269 7220-7238/com.calvin.android.demo2 I/System.out: 加密后: 7uoHa7bj9z+C0GqRofcJ57PQ/ttrKQu3
2020-10-20 12:21:07.569 7220-7238/com.calvin.android.demo2 I/System.out: 解密后: IDEA加密解密算法