天天看點

對稱加密算法之國際資料加密标準——IDEA1. 算法簡述2.模型分析3. 代碼實作

IDEA算法

  • 1. 算法簡述
  • 2.模型分析
  • 3. 代碼實作
    • 3.1 代碼實作
    • 3.2 測試代碼
    • 3.3 運作結果

1. 算法簡述

IDEA算法早于AES算法作為DES算法的可選替代算法,IDEA沒有在DES算法基礎上做修改,而是另辟溪徑尋求突破解決方案。

IDEA算法使用長度128位的密鑰,資料塊大小為64位。IDEA資料強加密算法,破解難度大。

IDEA算法是目前電子郵件加密算法之一。

2.模型分析

IDEA算法模型和對稱加密算法模型一緻

對稱加密算法之國際資料加密标準——IDEA1. 算法簡述2.模型分析3. 代碼實作

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

繼續閱讀