【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));
    }
}

原文发布于微信公众号 - 小工匠技术圈(xgn177971793771)

原文发表时间:2018-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

加密 原

在日常设计及开发中,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文加密成复杂的密文。目前主流加密手段大致可分为单向加密和双向加密。

773
来自专栏技术-分享

https介绍

假设A和B通过web进行通信,由于http是明文协议,双方发送的信息相当于在网上裸奔,双方的通信内容能够轻易的被窃听、篡改和冒充,因此,我们期望对通信加密。常见...

2554
来自专栏程序员叨叨叨

【翻译】数字签名是什么?

在写上一篇《Android Keystore漫谈》时对数字证书和数字签名的区别感觉模棱两可,于是网上找了找资料发现了一篇简单易懂的文章,对证书和签名有了一个较清...

844
来自专栏吴伟祥

加密总结 原

DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;

1134
来自专栏区块链

SSL证书的加密技术

根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算...

2326
来自专栏黑白安全

如何攻破加密算法

当应用加密算法时,有许多地方可能会出错。难点在于识别和分析程序员用来加密的方法,然后寻找其中的漏洞。漏洞的种类也很多,比如弱加密算法、弱密钥生成器、服务端漏洞和...

1792
来自专栏Albert陈凯

2018-10-11 对称加密、非对称加密、Hash算法看完这篇文章加解密就别蒙了散列函数 加密算法

http://hongyitong.github.io/2016/07/18/%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E3%8...

2733
来自专栏安恒信息

NSA能破解大部分Tor加密密钥

全研究人员认为,Tor匿名网络使用的大部分密钥能被美国国家安全局(NSA)破解。 渗透测试公司Errata Security CEO Rob Graham设立了...

3053
来自专栏java一日一条

DES/3DES/AES 三种对称加密算法在 Java 中的实现

1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂。

1292
来自专栏jouypub

区块链之非对称加密算法

非对称加密,在现在网络应用中,有这非常广泛的场景,更是加密货币的基础。本文主要介绍非对称加密、解密的原理和过程,以及在区块链中的使用。

1681

扫码关注云+社区

领取腾讯云代金券