Java中的对称加密详解
作者:路和远方 发布时间:2023-09-30 12:17:16
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
常见的对称加密方法
DES : Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
AES : Advanced Encryption Standard, 高级加密标准 .在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
代码案例
byte[] 和16进制字符串相互转换
private byte[] hexStringToBytes(String hexString) {
if (hexString.length() % 2 != 0) throw new IllegalArgumentException("hexString length not valid");
int length = hexString.length() / 2;
byte[] resultBytes = new byte[length];
for (int index = 0; index < length; index++) {
String result = hexString.substring(index * 2, index * 2 + 2);
resultBytes[index] = Integer.valueOf(Integer.parseInt(result, 16)).byteValue();
}
return resultBytes;
}
private String bytesToHexString(byte[] sources) {
if (sources == null) return null;
StringBuilder stringBuffer = new StringBuilder();
for (byte source : sources) {
String result = Integer.toHexString(source& 0xff);
if (result.length() < 2) {
result = "0" + result;
}
stringBuffer.append(result);
}
return stringBuffer.toString();
}
DES 加密和解密
private String encryptByDES(String input,String key) throws Exception {
// 算法
String algorithm = "DES";
String transformation = "DES";
// Cipher:密码,获取加密对象
// transformation:参数表示使用什么类型加密
Cipher cipher = Cipher.getInstance(transformation);
// 指定秘钥规则
// 第一个参数表示:密钥,key的字节数组 长度必须是8位
// 第二个参数表示:算法
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
// 对加密进行初始化
// 第一个参数:表示模式,有加密模式和解密模式
// 第二个参数:表示秘钥规则
cipher.init(Cipher.ENCRYPT_MODE,sks);
// 进行加密
byte[] bytes = cipher.doFinal(input.getBytes());
return bytesToHexString(bytes);
}
private String decryptByDES(String input,String key)throws Exception{
// 算法
String algorithm = "DES";
String transformation = "DES";
// Cipher:密码,获取加密对象
// transformation:参数表示使用什么类型加密
Cipher cipher = Cipher.getInstance(transformation);
// 指定秘钥规则
// 第一个参数表示:密钥,key的字节数组 长度必须是8位
// 第二个参数表示:算法
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
// 对加密进行初始化
// 第一个参数:表示模式,有加密模式和解密模式
// 第二个参数:表示秘钥规则
cipher.init(Cipher.DECRYPT_MODE,sks);
// 进行解密
byte [] inputBytes = hexStringToBytes(input);
byte[] bytes = cipher.doFinal(inputBytes);
return new String(bytes);
}
AES 加密和解密
private String encryptByAES(String input,String key) throws Exception {
// 算法
String algorithm = "AES";
String transformation = "AES";
// Cipher:密码,获取加密对象
// transformation:参数表示使用什么类型加密
Cipher cipher = Cipher.getInstance(transformation);
// 指定秘钥规则
// 第一个参数表示:密钥,key的字节数组 长度必须是16位
// 第二个参数表示:算法
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
// 对加密进行初始化
// 第一个参数:表示模式,有加密模式和解密模式
// 第二个参数:表示秘钥规则
cipher.init(Cipher.ENCRYPT_MODE,sks);
// 进行加密
byte[] bytes = cipher.doFinal(input.getBytes());
return bytesToHexString(bytes);
}
private String decryptByAES(String input,String key)throws Exception{
// 算法
String algorithm = "AES";
String transformation = "AES";
// Cipher:密码,获取加密对象
// transformation:参数表示使用什么类型加密
Cipher cipher = Cipher.getInstance(transformation);
// 指定秘钥规则
// 第一个参数表示:密钥,key的字节数组 长度必须是16位
// 第二个参数表示:算法
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
// 对加密进行初始化
// 第一个参数:表示模式,有加密模式和解密模式
// 第二个参数:表示秘钥规则
cipher.init(Cipher.DECRYPT_MODE,sks);
// 进行解密
byte [] inputBytes = hexStringToBytes(input);
byte[] bytes = cipher.doFinal(inputBytes);
return new String(bytes);
}
加密模式
ECB
Electronic codebook, 电子密码本. 需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密
优点:并行加密,速度快
缺点:同样的明文,加密成同样的密文,容易被破解,不利于安全保护CBC
优点:同样的原文生成不同的密文
缺点:串行处理,速度慢
注意: 需要一个初始的向量值IV
填充模式
当需要按块处理的数据, 数据长度不符合块处理需求时, 按照一定的方法填充满块长的规则
NoPadding
不填充.
在DES加密算法下, 要求原文长度必须是8byte的整数倍
在AES加密算法下, 要求原文长度必须是16byte的整数倍PKCS5Padding
数据块的大小为8位, 不够就补足
注意
默认情况下, 加密模式和填充模式为 : ECB/PKCS5Padding
如果使用CBC模式, 在初始化Cipher对象时, 需要增加参数, 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());
加密模式和填充模式
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
使用加密模式和填充模式的案例
private String encryptByAES(String input,String key) throws Exception {
// 算法
String algorithm = "AES";
String transformation = "AES/CBC/PKCS5Padding";
// Cipher:密码,获取加密对象
// transformation:参数表示使用什么类型加密
Cipher cipher = Cipher.getInstance(transformation);
// 指定秘钥规则
// 第一个参数表示:密钥,key的字节数组 长度必须是16位
// 第二个参数表示:算法
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
// 初始向量值长度必须是16位
String ivStr = "2222222222222221";
IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
// 对加密进行初始化
// 第一个参数:表示模式,有加密模式和解密模式
// 第二个参数:表示秘钥规则
cipher.init(Cipher.ENCRYPT_MODE,sks,iv);
// 进行加密
byte[] bytes = cipher.doFinal(input.getBytes());
return bytesToHexString(bytes);
}
private String decryptByAES(String input,String key)throws Exception{
// 算法
String algorithm = "AES";
String transformation = "AES/CBC/PKCS5Padding";
// Cipher:密码,获取加密对象
// transformation:参数表示使用什么类型加密
Cipher cipher = Cipher.getInstance(transformation);
// 指定秘钥规则
// 第一个参数表示:密钥,key的字节数组 长度必须是16位
// 第二个参数表示:算法
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
// 初始向量值长度必须是16位
String ivStr = "2222222222222221";
IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
// 对加密进行初始化
// 第一个参数:表示模式,有加密模式和解密模式
// 第二个参数:表示秘钥规则
cipher.init(Cipher.DECRYPT_MODE,sks,iv);
// 进行解密
byte [] inputBytes = hexStringToBytes(input);
byte[] bytes = cipher.doFinal(inputBytes);
return new String(bytes);
}
来源:https://blog.csdn.net/shuzhuchengfu/article/details/122698107


猜你喜欢
- 一、单线程改造为多线程也是个技术活正如我们看到耗子叔叔博客里写的那样,原来是单线程的应用程序,”后来,我们的程序性能有问题,所以需要变成多线
- 前言:如果简单地拍照片并非您应用的主要目标,那么您可能希望从相机应用中获取图片并对该图片执行一些操作。一、这就是第一种方法,比较简单,不用将
- Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的。Java
- 概念理解Properties 继承于 Hashtable。表示一个持久的属性集,属性列表以key-value的形式存在,key和value都
- #include <algorithm>class TestClass{public: int Sub(int x,
- 1.服务配置中心1.1 服务配置中心介绍首先我们来看一下,微服务架构下关于配置文件的一些问题:1.配置文件相对分散。在一个微服务架构下,配置
- 效果展示人脸支付效果视频密码框输入支付效果视频因为密码支付时会调起系统安全键盘,开启自动保护功能,防止泄露,会导致输入密码时录屏黑屏,故使用
- 目录1、若 a 的值为 3 时,下列程序段被执行后, c 的值是多少?( )2、以下哪项不是java基础类型()3、Java中只有整型才能使
- 在工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题,所以,今天我们一起聊聊线
- Struct的理论看过好一些,可是工作上基本没有应用过,Class倒处处都有。难道Struct就没有什么使用价值吗?搜了一下如何在类和结构中
- 最近在机顶盒上做一个gridview,其焦点需要在item的子控件上,但gridview的焦点默认在item上,通过android:desc
- Android自定义实现图片加文字功能分四步来写: 1,组合控件的xml; 2,自定义组合控件的属性; 3,自定义继承组合布局的class类
- 目录问题描述解决办法本文介绍下PasswordBox进行数据绑定的方法,本文参考链接。本文完整示例程序见GitHub。问题描述Passwor
- RestTemplate第一次请求响应速度较慢问题使用RestTemplate请求微信的接口发现第一次请求需要8秒左右的时间,查阅了JDK资
- javaWeb 四大域对象1)和属性相关的方法Object getAttribute(String name) 获取指定的属性En
- 1、HttpClient:代码复杂,还得操心资源回收等。代码很复杂,冗余代码多,不建议直接使用。2、RestTemplate: 是 Spri
- 一、稀疏数组1、什么是稀疏数组当一个数组中大部分元素为0,或者为同一个值的数组时,可以用稀疏数组来保存该数组。稀疏数组,记录一共有几行几列,
- C# 中有三种定时器,System.Windows.Forms 中的定时器和 System.Timers.Timer 的工作方式是完全一样的
- URL(Uniform Resource Locator)是统一资源 * ,它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,
- 前言其实很多人都会碰到文本不对齐,文字不对齐的情况,但是只要不明显被提出,一般都会置之不理。我关注这个问题是因为有个老哥问我倒计时的时候,1