对称加密算法之国际数据加密标准——IDEA

1. 算法简述

IDEA算法早于AES算法作为DES算法的可选替代算法,IDEA没有在DES算法基础上做修改,而是另辟溪径寻求突破解决方案。

IDEA算法使用长度128位的密钥,数据块大小为64位。IDEA数据强加密算法,破解难度大。

IDEA算法是目前电子邮件加密算法之一。

2.模型分析

IDEA算法模型和对称加密算法模型一致
在这里插入图片描述

3. 代码实现

Java中没有提供IDEA算法实现,但在Bouncy Castle中提供了IDEA算法实现,IDEA算法在Bouncy Castle中具体实现细节如下:

算法密钥长度默认密钥长度工作模式填充方式备注
IDEA128128ECBPKCS5Padding、 PKCS7Padding、ISO10126Padding、ZeroBytePaddingBouncy 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:lhzheng@grandstream.cn
 * 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加密解密算法
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calvin880828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值