java 对称加密算法实现详解
作者:小破孩123 发布时间:2021-07-29 22:34:57
标签:java,对称加密,算法,实现
前言
对于信息的加密方式多种多样,之前为大家介绍了一种自己设计的加密方式,有兴趣的朋友可以欣赏一下,欢迎给予指点。今天为大家介绍一下对称加密方式,所谓对称加密指的是加密和解密方式呈对称格式,即解密是加密的逆过程,下面我们就看一下:DES、3DES、AES、PBE这四种方式,他们的加密强度依次递增。好吧闲话少说,上代码:
首先我们先看一下DES:
package cn.edu.hpu.des;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class jdk_DES {
private static final String src = "I Love You !";
public static void main(String [] args){
jdk_DES.jdkDES();
}
@SuppressWarnings("static-access")
public static void jdkDES(){
try {
//获得KEY
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(56);//设置为默认值56即可
//获得KEY对象
SecretKey secrekeyone = keyGenerator.generateKey();
byte [] byteskey = secrekeyone.getEncoded();
//KEY转换
DESKeySpec deskeyspec = new DESKeySpec(byteskey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
Key secerkeytwo = factory.generateSecret(deskeyspec);
//加密
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(cipher.ENCRYPT_MODE, secerkeytwo);//设置模式为加密
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("jdkEDS:"+result.toString());
//解密
cipher.init(cipher.DECRYPT_MODE, secerkeytwo);//设置模式为解密
result = cipher.doFinal(result);
System.out.println("jdkEDS:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
第二种3重DES:
package cn.edu.hpu.des;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class jdk_3DES {
private static final String src = "I Love You !";
public static void main(String [] args){
jdk_3DES.jdk3DES();
}
@SuppressWarnings("static-access")
public static void jdk3DES(){
try {
//获得KEY
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
//keyGenerator.init(112);//设置密钥长度,默认值为168,也可设置为112
keyGenerator.init(new SecureRandom());//设置为默认值
//获得KEY对象
SecretKey secrekeyone = keyGenerator.generateKey();
byte [] byteskey = secrekeyone.getEncoded();
//KEY转换
DESKeySpec deskeyspec = new DESKeySpec(byteskey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
Key secerkeytwo = factory.generateSecret(deskeyspec);
//加密
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(cipher.ENCRYPT_MODE, secerkeytwo);//设置模式为加密
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("jdkEDS:"+result.toString());
//解密
cipher.init(cipher.DECRYPT_MODE, secerkeytwo);//设置模式为解密
result = cipher.doFinal(result);
System.out.println("jdkEDS:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
第三种AES:
package cn.edu.hpu.aes;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class jdk_AES {
private static final String src = "I Love You !";
public static void main(String [] args){
AES();
}
public static void AES(){
try {
//获得key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(new SecureRandom());//默认密钥长度为:
SecretKey secretKey = keyGenerator.generateKey();
byte [] keyBytes = secretKey.getEncoded();
//key转换
Key key = new SecretKeySpec(keyBytes, "AES");
//加密
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("AES="+result.toString());
//解密
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(result);
System.out.println("AES="+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
最后一种PBE:
package cn.edu.hpu.pbe;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
public class jdk_PBE {
public static final String src = "I Love You !";
public static void main(String [] args){
jdkPBE();
}
private static void jdkPBE(){
try {
//初始化盐
SecureRandom random = new SecureRandom();
byte [] salt = random.generateSeed(8);
//口令和密钥
String password = "imooc";
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());//生成密钥转换对象
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
Key key = factory.generateSecret(pbeKeySpec);
//加密
PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 100);//实例化PBE对象的一个输入的材料:参数分别为"盐和迭代次数"
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
byte [] result = cipher.doFinal(src.getBytes());
System.out.println("PBE:"+result.toString());
//解密
cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
result = cipher.doFinal(result);
System.out.println("PBE:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
结语
对于以上四种方式,PBE是一种较安全的加密方式,对加密起绝定作用的是盐和password,决定着加密的结果。以上即使要为大家介绍的对称加密方式,哪位有更好的方式,还望指教。
来源:https://www.cnblogs.com/AndroidJotting/p/4277766.html
0
投稿
猜你喜欢
- 本文实例讲述了Windows窗体的.Net框架绘图技术实现方法,非常实用,具体内容如下:一般来说,当编写一个典型的Windows 窗体程序时
- 代理模式代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采
- 前言WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏
- 前言自从 2017 年 C# 7.0 版本开始引入声明模式和常数模式匹配开始,到 2022 年的 C# 11 为止,最后一个板块列表模式和切
- Android ListView与ScrollView冲突的解决方法总结众所周知ListView与ScrollView都具有滚动能力,对于这
- 学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向
- 一、脚本生命周期Unity脚本中的常见必然事件如下表所示名称触发时机用途Awake脚本实例被创建时调用用于游戏对象的初始化,注意Awake的
- 前言我们知道移动应用页面跳转是非常重要的一部分,几乎我们的程序和用户打交道的就是页面,或者叫view,我们Android基本都是Activi
- /// <summary>/// 生成二维码/// </summary>/// <param name=&qu
- 问题:Kotlin升级引起的类找不到情况[其实跟Kotlin版本无关]java.lang.NoClassDefFoundError: Fai
- package TestList;import java.util.ArrayList;import java.util.Iterator;
- 本文实例为大家分享了Unity实现新手引导镂空效果的具体代码,供大家参考,具体内容如下一、实现思路创建有8个顶点的Mesh,内外边界都是四边
- SpringAOP 通过JoinPoint获取参数名和值在Java8之前,代码编译为class文件后,方法参数的类型固定,但是方法名称会丢失
- String.indexOf的模拟实现,没想象中有多么高深的查找算法,就是最普通的遍历查找思路:先找到第一个相同的字符,然后依次比较后面的字
- RabbitMQ的一些基本组件Producer:消息的生产者Consumer:消息的消费者Broker:MQ服务器,管理队列、消息Messa
- 添加Hibernate配置文件提示 解压hibernate.jar包 在org\hibernate目录下找到hibernate-config
- 概述最近在对之前写的一个 Spring Boot 的视频网站项目做功能完善,需要利用 FFmpeg 实现读取视频信息和自动截图的功能,查阅资
- 详解Java注解的实现与使用方法Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性。在如今各种框架及开发中非常常见,
- 一、可空类型修饰符(?)C#2.0里面实现了Nullable数据类型//A.比如下面一句,直接定义int为null是错误的,错误提示为无法将
- 背景最近再做一个需求,就是对站点的一些事件进行埋点,说白了就是记录用户的访问行为。那么这些数据怎么保存呢,人家点一下保存一下?显然不合适,肯