【Java小工匠聊密码学】--对称加密--IDEA
时间:2022-06-06
本文章向大家介绍【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));
}
}
- 解决Scrollview 嵌套recyclerview不能显示,高度不正常的问题
- 极客DIY:教你做一个简单的“太阳能”移动电源
- android RecycleView Adapter简单封装
- java入门
- Ray:AI的分布式系统
- hello Kotlin
- 小学生都学Python了,你还不知道怎么开始
- java实现最基础的socket网络通信
- struts的声明式异常处理 demo
- npm管理工具介绍
- 对windows密码抓取神器mimikatz的逆向分析
- Keras中神经网络模型的5阶段生命周期
- java的断言(assert)
- Android studio中Rendering Problems不能可视化操作的解决办法
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- npm -i 与npm install -S与-D的区别以及dependencies与devDependencies的区别
- axios POST提交数据的三种请求方式写法
- 将资源文件编译成源代码文件
- 一道简单的笔试题_时钟切换电路(Glitch-free clock switching circuit)
- 【STM32F429开发板用户手册】第26章 STM32F429的定时器应用之TIM1-TIM14的中断实现
- 【STM32F407开发板用户手册】第26章 STM32F407的定时器应用之TIM1-TIM14的中断实现
- ATTR节点应用
- 等待队列
- samba
- gpio_key按键驱动
- Linux中断下半部实现机制
- linux中led驱动(设备树)编程笔记
- POLL机制
- C语言规范_V1.1
- 滑动窗口