【Java小工匠聊密码学】--对称加密--IDEA

时间:2022-06-06
本文章向大家介绍【Java小工匠聊密码学】--对称加密--IDEA,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、什么是IDEA

  国际数据加密算法(IDEA)是[上海交通大学]教授来学嘉与瑞士学者James Massey联合提出的。它在1990年正式公布并在以后得到增强。这种算法是在[DES算法]的基础上发展出来的,类似于三重DES。发展IDEA也是因为感到[DES] 具有密钥太短等缺点。IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。

2、IDEA算法特点

  类似于[DES] ,IDEA算法也是一种数据块加密算法,它设计了一系列加密轮次,每轮加密都使用从完整的加密密钥中生成的一个子密钥。与DES的不同处在于,它采用软件实现和采用硬件实现同样快速。   由于IDEA是在美国之外提出并发展起来的,避开了美国法律上对[加密技术]的诸多限制,因此,有关IDEA算法和实现技术的书籍都可以自由出版和交流,可极大地促进IDEA的发展和完善。

3、IDEA算法应用

  目前IDEA在工程中已有大量应用实例,PGP(Pretty Good Privacy)就使用IDEA作为其分组加密算法;安全套接字层[SSL](Secure Socket Layer)也将IDEA包含在其加密算法库SSLRef中 新的标准已经删除IDEA支持;IDEA算法专利的所有者Ascom公司也推出了一系列基于IDEA算法的安全产品,包括:基于IDEA的Exchange安全插件、IDEA[加密芯片]、IDEA加密软件包等。IDEA算法的应用和研究正在不断走向成熟。

4、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));
    }
}