第九章 对称加密算法--IDEA

注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第7章“初等加密算法--对称加密算法”

9.1、IDEA

特点:

  • 先于AES出来取代DES
  • 安全性极高
  • 常用于电子邮件加密算法

9.2、实现方式

  • Bouncy Castle(BC,工作模式只有ECB,密钥长度为128位)

9.2.1、基于BC实现的IDEA算法

  1 package com.util.idea;
  2
  3 import java.io.UnsupportedEncodingException;
  4 import java.security.InvalidAlgorithmParameterException;
  5 import java.security.InvalidKeyException;
  6 import java.security.Key;
  7 import java.security.NoSuchAlgorithmException;
  8 import java.security.NoSuchProviderException;
  9 import java.security.Security;
 10 import java.security.spec.InvalidKeySpecException;
 11
 12 import javax.crypto.BadPaddingException;
 13 import javax.crypto.Cipher;
 14 import javax.crypto.IllegalBlockSizeException;
 15 import javax.crypto.KeyGenerator;
 16 import javax.crypto.NoSuchPaddingException;
 17 import javax.crypto.SecretKey;
 18 import javax.crypto.spec.SecretKeySpec;
 19
 20 import org.apache.commons.codec.binary.Base64;
 21 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 22
 23 /**
 24  * 基于BC的IDEA算法,工作模式只有ECB
 25  */
 26 public class IDEABC {
 27     private static final String ENCODING = "UTF-8";
 28     private static final String KEY_ALGORITHM = "IDEA";//产生密钥的算法
 29     private static final String CIPHER_ALGORITHM = "IDEA/ECB/PKCS5Padding";//加解密算法 格式:算法/工作模式/填充模式
 30     /**
 31      * 产生密钥
 32      */
 33     public static byte[] getKey() throws NoSuchAlgorithmException{
 34         Security.addProvider(new BouncyCastleProvider());//在BC中用,JDK下去除
 35         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
 36         keyGenerator.init(128);//初始化密钥长度,128
 37         SecretKey key =keyGenerator.generateKey();//产生密钥
 38         return key.getEncoded();
 39     }
 40
 41     /**
 42      * 还原密钥:二进制字节数组转换为Java对象
 43      */
 44     public static Key toKey(byte[] keyByte){
 45         return new SecretKeySpec(keyByte, KEY_ALGORITHM);
 46     }
 47
 48     /**
 49      * IDEA加密
 50      * @param data     带加密数据
 51      * @param keyByte  密钥
 52      */
 53     public static byte[] encrypt(String data, byte[] keyByte) throws NoSuchAlgorithmException,
 54                                                                      NoSuchProviderException,
 55                                                                      NoSuchPaddingException,
 56                                                                      InvalidKeyException,
 57                                                                      IllegalBlockSizeException,
 58                                                                      BadPaddingException,
 59                                                                      UnsupportedEncodingException {
 60         Key key = toKey(keyByte);//还原密钥
 61         Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下用
 62         cipher.init(Cipher.ENCRYPT_MODE, key);//设置加密模式并且初始化key
 63         return cipher.doFinal(data.getBytes(ENCODING));
 64     }
 65
 66     /**
 67      * IDEA加密,并转为16进制字符串或Base64编码字符串
 68      */
 69     public static String encryptIDEAHex(String data, byte[] keyByte) throws NoSuchAlgorithmException,
 70                                                                            NoSuchProviderException,
 71                                                                            NoSuchPaddingException,
 72                                                                            InvalidKeyException,
 73                                                                            IllegalBlockSizeException,
 74                                                                            BadPaddingException,
 75                                                                            UnsupportedEncodingException {
 76         byte[] encodedByte = encrypt(data, keyByte);
 77         //return new String(Hex.encode(encodedByte));//借助BC
 78         //return new String(org.apache.commons.codec.binary.Hex.encodeHexString(encodedByte));//借助CC
 79         return Base64.encodeBase64String(encodedByte);//借助CC的Base64编码
 80     }
 81
 82     /**
 83      * IDEA解密
 84      * @param data        待解密数据为字节数组
 85      * @param keyByte    密钥
 86      */
 87     public static byte[] decrypt(byte[] data, byte[] keyByte) throws NoSuchAlgorithmException,
 88                                                                      NoSuchProviderException,
 89                                                                      NoSuchPaddingException,
 90                                                                      InvalidKeyException,
 91                                                                      IllegalBlockSizeException,
 92                                                                      BadPaddingException {
 93         Key key = toKey(keyByte);//还原密钥
 94         Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下用
 95         cipher.init(Cipher.DECRYPT_MODE, key);
 96         return cipher.doFinal(data);
 97     }
 98
 99     /**
100      * IDEA解密
101      * @param data        待解密数据为字符串
102      * @param keyByte    密钥
103      */
104     public static byte[] decrypt(String data, byte[] keyByte) throws NoSuchAlgorithmException,
105                                                                      NoSuchProviderException,
106                                                                      NoSuchPaddingException,
107                                                                      InvalidKeyException,
108                                                                      IllegalBlockSizeException,
109                                                                      BadPaddingException  {
110         Key key = toKey(keyByte);//还原密钥
111         Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下用
112         cipher.init(Cipher.DECRYPT_MODE, key);
113         return cipher.doFinal(Base64.decodeBase64(data));//注意data不可以直接采用data.getByte()方法转化为字节数组,否则会抛异常
114     }
115
116     /**
117      * 测试
118      */
119     public static void main(String[] args) throws NoSuchAlgorithmException,
120                                                   InvalidKeyException,
121                                                   InvalidKeySpecException,
122                                                   NoSuchPaddingException,
123                                                   IllegalBlockSizeException,
124                                                   BadPaddingException,
125                                                   UnsupportedEncodingException,
126                                                   NoSuchProviderException,
127                                                   InvalidAlgorithmParameterException {
128         String data = "找一个好姑娘做老婆是我的梦 想!";
129         /*************测试encrypt()、decrypt()**************/
130         System.out.println("原文-->"+data);
131         byte[] keyByte = IDEABC.getKey();
132         System.out.println("密钥-->"+Base64.encodeBase64String(keyByte));//这里将二进制的密钥使用base64加密保存,这也是在实际中使用的方式
133         byte[] encodedByte = IDEABC.encrypt(data, keyByte);
134         System.out.println("加密后-->"+encodedByte);
135         byte[] encodedByte2 = IDEABC.encrypt(data, keyByte);
136         System.out.println("加密后-->"+encodedByte2);
137         byte[] decodedByte = IDEABC.decrypt(encodedByte, keyByte);
138         System.out.println("解密后-->"+decodedByte);
139         for(int i=0;i<encodedByte.length;i++){
140             System.out.println(encodedByte[i]==encodedByte2[i]);
141         }
142         /*************测试encryptIDEAHex()、decrypt()**************/
143         System.out.println("原文-->"+data);
144         byte[] keyByte3 = IDEABC.getKey();
145         System.out.println("密钥-->"+Base64.encodeBase64String(keyByte3));//这里将二进制的密钥使用base64加密保存,这也是在实际中使用的方式
146         String encodedStr = IDEABC.encryptIDEAHex(data, keyByte3);
147         System.out.println("加密后-->"+encodedStr);
148         String encodedByte4 = IDEABC.encryptIDEAHex(data, keyByte3);
149         System.out.println("加密后-->"+encodedByte4);
150         byte[] decodedByte3 = IDEABC.decrypt(Base64.decodeBase64(encodedStr), keyByte3);
151         System.out.println("解密Byte[]后-->"+decodedByte3);
152         byte[] decodedByte4 = IDEABC.decrypt(encodedStr, keyByte3);
153         System.out.println("解密String后-->"+decodedByte4);
154     }
155 }

注意:

  • 与基于BC实现的AES算法代码基本一样
时间: 2024-10-09 23:36:48

第九章 对称加密算法--IDEA的相关文章

深入浅出Zabbix 3.0 -- 第九章 数据可视化

第九章 数据可视化 Zabbix是一个非常灵活.强大的监控系统,它不仅能够监控大量不同类型的数据指标,并为这些数据及数据之间的关联提供了多种可视化工具,通过图形.展示屏.网络拓扑图等将数据直观的展现出来,实时的浏览和查看监控设备的状态. 9.1 图形 Zabbix 3.0中支持三种graphs(图形),即simple graphs(简单图形).ad-hocgraphs(自组图形)和customgraphs(自定义图形). 9.1.1 简单图形 简单图形是Zabbix系统内置的一种方法,为监控项数

第十二章 非对称加密算法-RSA

注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与DH不同) 与DH不同的第二点是,RSA自己可以完成加解密,而DH需要依赖于对称加密算法 “私钥加密,公钥解密”或“公钥加密,私钥解密” 公钥长度远小于私钥长度(对下边的代码进行测试,自己比较结果) 加解密流程: 1)发送方(假设为甲方)构建密钥对,自己保留私钥,将公钥发送给接收方(假设为乙方) 2)甲方使用密

go语言教程哪里有?Go从入门到精通系列视频3.1 对称加密算法

3.1.1 对称加密的概述 对称加密(也叫私钥加密算法)指加密和解密使用相同密钥的加密算法.它要求发送方和接收方在安全通信之前,商定一个密钥.对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要. 对称加密算法的优点是计算量小.加密速度快.加密效率高. 不足之处是,参与方需要提前持有密钥,一旦有人泄露则系统安全性被破坏:另外如何在不安全通道中提前分发密钥也是个问题,密钥管理非常困难. 基于“对称密钥”的加密算法主要有DES.3

javascript高级程序设计 第九章-- 客户端检测

javascript高级程序设计 第九章-- 客户端检测 客户端检测是javascript开发中最具争议的一个话题,由于浏览器间存在差别,通常需要根据不同浏览器的能力分别编写不同的代码.有下列常使用的客户端检测方法:能力检测:在编写代码之前先检测特定浏览器的能力.例如,脚本在调用某个函数之前,可能要先检测该函数是否存在.这种检测方法将开发人员从考虑具体的浏览器类型和版本中解放出来,让他们把注意力集中到相应的能力是否存在上.能力检测无法精确地检测特定的浏览器和版本.怪癖检测:怪癖实际上是浏览器中存

zabbix专题:第九章 自定义key(案例:监控内存,监控nginx状态)

第九章 自定义key 对Linux有兴趣的朋友加入QQ群:476794643 在线交流 本文防盗链:http://zhang789.blog.51cto.com 为什么要自定义KEY 有时候我们想让被监控端执行一个zabbix没有预定义的检测,zabbix的用户自定义参数功能提供了这个方法.我们可以在客户端配置文件zabbix_angentd.conf里面配置UserParameter. 语法如下: UserParameter=key,command 用户自定义参数包含一个key和一个命令,ke

读书笔记第九章

第九章HAL是建立在linux驱动之上的一套程序库.这套程序库并不属于linux内核,而是属于linux内核层之上的应用层.可以用来保护不想公开源代码的作者.HAL架构比较简单,其基本原理就是在安卓系统中使用程序库调用位于内核空间的linux驱动,然后安卓应用程序可以通过NDK程序访问HAL中的程序库,或直接在安卓应用程序中访问HAL中的程序库.编写一款支持HAL的linux驱动程序的步骤:1.编写linux驱动,linux驱动的代码要尽量简介,尽可能将业务逻辑放到HAL library中.2.

对称加密算法

对称加密算法 提示:加密内容属于高级程序员的话题!有些内容会很枯燥!注意掌握加密的思路和操作步骤即可!代码不要求会写,只要会用就行! 又称传统加密算法 加密和解密使用同一个密钥 对称加密算法示例 密钥:X 加密算法:每个字符+X 明文:Hello 密钥为 1 时加密结果:Ifmmp 密钥为 2 时加密结果:Jgnnq 优缺点 优点 算法公开.计算量小.加密速度快.加密效率高 缺点 双方使用相同钥匙,安全性得不到保证 注意事项 密钥的保密工作非常重要 密钥要求定期更换 经典算法 算法 说明 DES

第九章 两种模式的比较

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include

第九章 用多线程来读取epoll模型下的客户端数据

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include