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加密解密算法