第九章 对称加密算法--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 定义 对称加密算法是应用较早的加密算法, ...
随机推荐
- Python-OpenCV —— 基本操作详解
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Pyt ...
- Frame报文
链路层帧常用的帧格式有两种:Ethernet II 与 IEEE802.3 Ethernet II 格式多用于终端设备的通信 IEEE802.3 格式多用于网络设备的通信 如何区分这两种报文 ...
- 【F12】谷歌浏览器F12前端调试工具 Console
谷歌浏览器F12前端调试工具 Console 前言 先上图:不知道有多少人发现,在浏览器开发工具的“Console”上的百度首页的关于百度招聘的信息: 今天要给大家介绍的就是是Web前端调试工具中的C ...
- 可以搜索到DedeCms后台文章列表文档id吗?或者快速定位id编辑文章
我们在建站时有的时候发现之前的文章有错误了,要进行修改,但又不知道文章名,只知道大概的文章id,那么可以搜索到DedeCms后台文章列表文档id吗?或者快速定位文章id方便修改? 第一种方法:复制下面 ...
- OA系统部署短信过程
安装dotNetFx40_Client_setup.exe插件 安装mysql_installer_community_V5.6.21.1_setup.1415604646.msi数据库 根据数据库版 ...
- [py][mx]django自定义认证类-实现邮箱作为用户名登录
创建自定义验证用户名密码类CustomBackend users/views.py from django.contrib.auth import authenticate, login from d ...
- svn 常见问题记录
One or more files are in a conflicted state 情景:A组员新增文件并提交,B组员更新出现如下图情况. 解决方案:直接拷贝到B组员工作区.
- Linux定时任务出现问题时正确的解决步骤
但凡是提供服务的,都要有本账.软件服务也不例外.无论是Apache,Nginx,还是我们自己搭建的网站,日志是标配.这里的日志就是一本账. 当定时任务出现问题时,正确的处理步骤是: 1,定时任务服务是 ...
- Oracle业务用户密码过期问题的解决
实验环境:Oracle 11.2.0.4 如果DBA不知道业务用户密码,当业务密码过期,应用要求DBA帮忙重设为原来的密码. 1.查询业务用户密码 从user$查到hash加密过的值: select ...
- 实现对多维数组按照某个键值排序的两种方法(array_multisort和array_sort)
实现对多维数组按照某个键值排序的两种解决方法(array_multisort和array_sort): 第一种:array_multisort()函数对多个数组或多维数组进行排序. //对数组$ ...