第九章 对称加密算法--IDEA
注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第7章“初等加密算法--对称加密算法”
9.1、IDEA
特点:
- 先于AES出来取代DES
- 安全性极高
- 常用于电子邮件加密算法
9.2、实现方式
- Bouncy Castle(BC,工作模式只有ECB,密钥长度为128位)
9.2.1、基于BC实现的IDEA算法
package com.util.idea; import java.io.UnsupportedEncodingException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; /** * 基于BC的IDEA算法,工作模式只有ECB */ public class IDEABC { private static final String ENCODING = "UTF-8"; private static final String KEY_ALGORITHM = "IDEA";//产生密钥的算法 private static final String CIPHER_ALGORITHM = "IDEA/ECB/PKCS5Padding";//加解密算法 格式:算法/工作模式/填充模式 /** * 产生密钥 */ public static byte[] getKey() throws NoSuchAlgorithmException{ Security.addProvider(new BouncyCastleProvider());//在BC中用,JDK下去除 KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM); keyGenerator.init(128);//初始化密钥长度,128 SecretKey key =keyGenerator.generateKey();//产生密钥 return key.getEncoded(); } /** * 还原密钥:二进制字节数组转换为Java对象 */ public static Key toKey(byte[] keyByte){ return new SecretKeySpec(keyByte, KEY_ALGORITHM); } /** * IDEA加密 * @param data 带加密数据 * @param keyByte 密钥 */ public static byte[] encrypt(String data, byte[] keyByte) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { Key key = toKey(keyByte);//还原密钥 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下用 cipher.init(Cipher.ENCRYPT_MODE, key);//设置加密模式并且初始化key return cipher.doFinal(data.getBytes(ENCODING)); } /** * IDEA加密,并转为16进制字符串或Base64编码字符串 */ public static String encryptIDEAHex(String data, byte[] keyByte) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { byte[] encodedByte = encrypt(data, keyByte); //return new String(Hex.encode(encodedByte));//借助BC //return new String(org.apache.commons.codec.binary.Hex.encodeHexString(encodedByte));//借助CC return Base64.encodeBase64String(encodedByte);//借助CC的Base64编码 } /** * IDEA解密 * @param data 待解密数据为字节数组 * @param keyByte 密钥 */ public static byte[] decrypt(byte[] data, byte[] keyByte) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { Key key = toKey(keyByte);//还原密钥 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下用 cipher.init(Cipher.DECRYPT_MODE, key); return cipher.doFinal(data); } /** * IDEA解密 * @param data 待解密数据为字符串 * @param keyByte 密钥 */ public static byte[] decrypt(String data, byte[] keyByte) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { Key key = toKey(keyByte);//还原密钥 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下用 cipher.init(Cipher.DECRYPT_MODE, key); return cipher.doFinal(Base64.decodeBase64(data));//注意data不可以直接采用data.getByte()方法转化为字节数组,否则会抛异常 } /** * 测试 */ public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, NoSuchProviderException, InvalidAlgorithmParameterException { String data = "找一个好姑娘做老婆是我的梦 想!"; /*************测试encrypt()、decrypt()**************/ System.out.println("原文-->"+data); byte[] keyByte = IDEABC.getKey(); System.out.println("密钥-->"+Base64.encodeBase64String(keyByte));//这里将二进制的密钥使用base64加密保存,这也是在实际中使用的方式 byte[] encodedByte = IDEABC.encrypt(data, keyByte); System.out.println("加密后-->"+encodedByte); byte[] encodedByte2 = IDEABC.encrypt(data, keyByte); System.out.println("加密后-->"+encodedByte2); byte[] decodedByte = IDEABC.decrypt(encodedByte, keyByte); System.out.println("解密后-->"+decodedByte); for(int i=0;i<encodedByte.length;i++){ System.out.println(encodedByte[i]==encodedByte2[i]); } /*************测试encryptIDEAHex()、decrypt()**************/ System.out.println("原文-->"+data); byte[] keyByte3 = IDEABC.getKey(); System.out.println("密钥-->"+Base64.encodeBase64String(keyByte3));//这里将二进制的密钥使用base64加密保存,这也是在实际中使用的方式 String encodedStr = IDEABC.encryptIDEAHex(data, keyByte3); System.out.println("加密后-->"+encodedStr); String encodedByte4 = IDEABC.encryptIDEAHex(data, keyByte3); System.out.println("加密后-->"+encodedByte4); byte[] decodedByte3 = IDEABC.decrypt(Base64.decodeBase64(encodedStr), keyByte3); System.out.println("解密Byte[]后-->"+decodedByte3); byte[] decodedByte4 = IDEABC.decrypt(encodedStr, keyByte3); System.out.println("解密String后-->"+decodedByte4); } }
注意:
- 与基于BC实现的AES算法代码基本一样
第九章 对称加密算法--IDEA的更多相关文章
- 第七章 对称加密算法--DES
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 7.1.对称加密算法 特点: 加密与解密使用同一个密钥 是使用最广的算法 常见对称加密 ...
- 第十二章 非对称加密算法-RSA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...
- 第十一章 非对称加密算法--DH
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 11.1.非对称加密算法 特点: 发送方和接收方均有一个密钥对(公钥+私钥),其中公 ...
- 第八章 对称加密算法--AES
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 8.1.AES 特点: 密钥建立时间短.灵敏性好.内存需求低(不管怎样,反正就是好) ...
- .NET Core加解密实战系列之——对称加密算法
简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...
- 精通Web Analytics 2.0 (11) 第九章: 新兴分析—社交,移动和视频
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第九章: 新兴分析-社交,移动和视频 网络在过去几年中发生了不可思议的发展变化:从单向对话到双向对话的转变; 由视频,Ajax和 ...
- php-简单对称加密算法和字符串与十六进制之间的互转函数
/** * 简单对称加密算法之加密 * @param String $string 需要加密的字串 * @param String $skey 加密EKY * @return String */fun ...
- 使用java库中的对称加密算法
对称加密算法是说加密方和解密方使用相同的密钥.常见的对称加密算法包括4个,DES,DESede(3DES),AES,PBE. 本文讨论的内容是加密算法,不是Message Digest,不是编码.下面 ...
- [转] 对称加密算法DES、3DES
转自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法, ...
随机推荐
- JS模块化编程(四)--require应用
获取&使用require.js 下载最新版的Require.JS.下载之后,把它放在项目的脚本文件夹下,比如 js 文件夹下,项目结构看上去应该是: 要充分使用Require.JS,将html ...
- windows平台mysql密码破解设置
windows平台下,5.7版本mysql,破解密码的两种方式: #1 关闭mysql服务net stop mysql 启动mysql服务 跳过权限 #2 在cmd中执行:mysqld --skip- ...
- python float()
1.函数功能将一个数值或者字符转换成浮点型数值 >>> a = 12345 >>> amount = float(a) >>> print(amo ...
- ID和Name
ID和Name都可以用来标识一个标记,Javascript分别有两个方法getElementById和getElementByName来定位Dom节点. 区别如下: 1.我们知道在网页做Post提交时 ...
- UVALive - 7261 Xiongnu's Land
思路: 先二分下界,再二分上届. #include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB ...
- Oracle性能优化之HINT的用法
1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_I ...
- linux基础命令---touch
touch 将文件的访问时间和修改时间修改为当前时间.如果指定的文件不存在,那么将会创造空文件,除非指定-c或-h选项.文件参数字符串‘-‘被专门处理,并导致touch更改与标准输出相关联的文件的时间 ...
- 5+App使用定位
1.定位方法 5+App定位方法:5+ API中的Geolocation模块 Geolocation目前支持h5内置的定位,百度,高德.h5内置定位支持wgs84坐标系:百度支持gcj ...
- 获取Linux时间函数
Linux下clock_gettime函数详解 要包含这头文件<time.h> 且在编译链接时需加上 -lrt ;因为在librt中实现了clock_gettime函数. --- stru ...
- 如何安装Apache
第一步:将Apache24解压到C盘根目录下 第二步:进入C:\Apache24\bin目录下 第三步:打开浏览器,网页中输入localhost,返回结果为It works!则说明Apache安装配置 ...