[Java][Java加密与解密]《对称加密简单概念与代码实现》
2023-06-13 09:14:26 时间
对称加密:
将要保护的数据用某种算法进行处理,处理后的数据成为密文。
加密算法公开,但是密钥不公开,密钥可以理解为开锁的数字密码,不知道密码就无法进行解密数据。目前常用的对称加密算法有AES
。
且AES
有AES-128
、AES-256标准。
简单来讲就是密钥长度的不一样,AES-128
采用16字节的密钥。AES-256
采用32字节的密钥更安全。
让我们来看下加密代码实例
// 偏移量(可自定义)
public static final String VIPARA = "0123456789123456"; // AES 为16bytes. DES 为8bytes
// 编码方式
public static final String CODE_TYPE = "UTF-8";
// 填充类型
public static final String AES_TYPE = "AES/ECB/PKCS5Padding";
// 密钥(可自定义)
private static final String AES_KEY = "abcdabcdabcdabcd";
// AES固定格式为128/192/256bits.即:16/24/32bytes。DES固定格式为128bits,即8bytes。
/**
* 加密
*
* @param cleartext
* @return
*/
public static String encrypt(String cleartext) {
try {
IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());
// 两个参数,第一个为密钥字节数组, 第二个为加密方式 AES
SecretKeySpec key = new SecretKeySpec(AES_KEY.getBytes(), "AES");
// 实例化加密类,参数为加密方式,要写全
Cipher cipher = Cipher.getInstance(AES_TYPE); // PKCS5Padding比PKCS7Padding效率高,PKCS7Padding可支持IOS加解密
// 加密时使用:ENCRYPT_MODE; 解密时使用:DECRYPT_MODE;
cipher.init(Cipher.ENCRYPT_MODE, key); // CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量
// 加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式
byte[] encryptedData = cipher.doFinal(cleartext.getBytes(CODE_TYPE));
return new BASE64Encoder().encode(encryptedData);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 解密
*
* @param encrypted
* @return
*/
public static String decrypt(String encrypted) {
try {
byte[] byteMi = new BASE64Decoder().decodeBuffer(encrypted);
SecretKeySpec key = new SecretKeySpec(AES_KEY.getBytes(), "AES");
Cipher cipher = Cipher.getInstance(AES_TYPE);
// 与加密时不同MODE:Cipher.DECRYPT_MODE
cipher.init(Cipher.DECRYPT_MODE, key); // CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量
byte[] decryptedData = cipher.doFinal(byteMi);
return new String(decryptedData, CODE_TYPE);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
public static void main(String[] args) throws Exception {
String content = "123456";
test(content);
}
public static void test(String content) throws UnsupportedEncodingException {
System.out.println("加密内容:" + content);
// 字节数
int num = content.getBytes(CODE_TYPE).length;
System.out.println("加密内容字节数: " + num);
// 加密
String encryptResult = encrypt(content);
content = new String(encryptResult);
System.out.println("加密后:" + content);
// 解密
String decryptResult = decrypt(encryptResult);
content = new String(decryptResult);
System.out.println("解密完成后:" + content);
}
控制台输出:
加密内容:123456
加密内容字节数: 6
加密后:W9291IebiZmw394ohe0Qiw==
解密完成后:123456
关于AES
常见的使用场景:
如Http Living Streaming
简称HLS
,目前诸多网站采用这种协议进行在线视频播放。
相关文章
- fileinputstream java_Java FileInputStream close()方法
- java有什么作用_Java有什么用「建议收藏」
- java和c语言哪个简单_Java编程和C语言哪个好学
- md5 java 实现_MD5加密的Java实现
- java环境_Java基础篇——环境配置
- java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)[通俗易懂]
- 解决java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have availa
- java标识符命名_java标识符命名规则「建议收藏」
- JVM底层—Java Class字节码文件解析
- java webservice接口开发教程_JAVA入门教程
- 一文搞懂Java异步编程之FutureTask
- Java多线程例子
- 从 Java 的角度实践 Go 工程| 青训营笔记
- Java八大常用类(六) Math类和Random类
- IntelliJ IDEA 2023 for Mac(最好用的Java开发工具)
- java实现快速排序详解编程语言
- java实现图片与base64字符串之间的转换详解编程语言
- 深入Linux环境下的Java测试(linuxjava测试)
- 删除Linux中的Java程序(linux删除java)
- 缓存基于Redis实现Java自动过期缓存(redisjava过期)
- Java轻松处理Redis缓存(java处理redis)
- Java搭配MySQL,实现创新跳跃的可能(java 与mysql)
- 询Java与Oracle联合查询更高效的数据处理方式(java oracle查)
- [JAVA]十四种Java开发工具点评
- 为Java程序员准备的10分钟Perl教程
- java多线程编程之慎重使用volatile关键字