JAVA实现对称加密
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
一、对称加密算法DES
1、概述:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
对称加密的特点: 即加密密钥 = 解密密钥
2、常用的对称加密算法:
- 初等
- DES —3DES
- AES
- PBE
- IDEA
3、对称加密算法 —— DES
DES( Data Encryption Standard ) 是一种数据加密标准。
其密钥规则如下:
4、JDK实现DES算法
【1】初始化密钥
- 使用KeyGenerator类的getInstance()静态方法,获取生成指定算法的密钥生成器,参数是算法名称.
- 使用KeyGenerator类的init()方法进行密钥生成器的初始化,指定密钥生成器产生密钥的长度.
- 使用KeyGenerator类的generatorKey()方法生成一个密钥对象,返回SecretKey密钥对象.
- SecretKey为密钥对象.使用它的getEncoded()方法返回一个密钥(字节数组形式)
【2】转化密钥(还原密钥)
- 将jdk生成的密钥对象转化成DES规则的密钥对象.
- 创建一个DESKeySpec实例,作用是将JDK初始化的密钥转化成DES规则的密钥.
- 构造方法参数是JDK生成的密钥(字节数组形式).
- 使用SecretKeyFactory类的getInstance()静态方法获取一个密钥工厂实例,参数是算法名称
- 使用SecretKeyFactory类的generateSecret()方法生成密钥,参数是DESKeySpec实例.返回SecretKey,返回的SecretKey实例就是符合DES算法的密钥.
package com.webcode.cn.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;
import org.apache.commons.codec.binary.Hex;
public class DES {
static String string = "wen-min";
public static void main(String[] args) {
DES.jdkDES();
}
public static void jdkDES() {
try {
// 生成key//返回生成指定算法密钥的KeyGenerator对象
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(56);//初始化此密钥生成器,使其具有确定的密钥大小
SecretKey secretKey = keyGenerator.generateKey();//生成一个密钥
byte[] bs = secretKey.getEncoded();
// key转换
DESKeySpec desKeySpec = new DESKeySpec(bs); //实例化DES密钥规则
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); //实例化密钥工厂
Key convertSecretKey = factory.generateSecret(desKeySpec); //生成密钥
// 加密
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] result = cipher.doFinal(string.getBytes());
System.out.println("jdk des encrypt:" + Hex.encodeHexString(result));
// 解密
cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
result = cipher.doFinal(result);
System.out.println("jdk des decrypt:" + new String(result));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
执行结果:
jdk des encrypt:ea3293902913510b
jdk des decrypt:wen-min
5、DES加密算法的消息传递机制;
加密算法深入学习链接:https://www.iteye.com/blog/snowolf-379860
二、对称加密算法3DES
3DES,即3重DES,是DES的一个分支;但由于安全性问题;且违反柯克霍夫原则,使用频率低。
好处:
- 密钥长度增强;
- 迭代次数提高。
1、3重DES的规则:
2、JDK实现3DES
与实现DES方式基本一致,算法名称要改为DESede,密钥长度为168,转换密钥时使用DESedeKeySpec类.
在使用KeyGenerator的init()方法时,参数要指定密钥的长度.可以直接指定一个数值.同时也可以使用SecureRandom实例作为参数,该实例的作用是获取KeyGenerator对应算法其默认的密钥长度.
package com.webcode.cn.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;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.codec.binary.Hex;
public class DES_three {
static String string = "wen-min";
public static void main(String[] args) {
DES_three.jdkDES();
}
public static void jdkDES() {
try {
// 生成key//返回生成指定算法密钥的KeyGenerator对象
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
keyGenerator.init(168);//初始化此密钥生成器,使其具有确定的密钥大小
SecretKey secretKey = keyGenerator.generateKey();//生成一个密钥
byte[] bs = secretKey.getEncoded();
// key转换
DESedeKeySpec desKeySpec = new DESedeKeySpec(bs); //实例化DES密钥规则
SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); //实例化密钥工厂
SecretKey convertSecretKey = factory.generateSecret(desKeySpec); //生成密钥
// 加密
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] result = cipher.doFinal(string.getBytes());
System.out.println("jdk 3des encrypt:" + Hex.encodeHexString(result));
// 解密
cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
result = cipher.doFinal(result);
System.out.println("jdk 3des decrypt:" + new String(result));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
执行结果:
jdk 3des encrypt:0656fdb061c86e8a
jdk 3des decrypt:wen-min
三、对称加密算法AES
1、概述
AES是DES的高级替代,也是目前使用最多的对称加密算法
DES有漏洞,所以,产生了3重DES<br>
3重DES的效率比较低,所以产生了AES<br>
AES的特点是:
- 使用的更为广泛
- 目前还没有被破解
- 通常用与移动通信系统加密和SSH协议的软件加密
2、AES的使用规则:
3、JDK实现AES加密解密算法:
package com.webcode.cn.des;
import java.security.Key;
//import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
//import org.bouncycastle.util.encoders.Base64;
public class AES {
static String string = "wen-min";
public static void main(String[] args) {
AES.jdkAES();
}
public static void jdkAES(){
try {
//生成key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
//设置密钥长度
keyGenerator.init(128);
//生成密钥对象
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(string.getBytes());
System.out.println("jdk aes encrypt: " + Base64.encodeBase64String(result));
//初始化,设置为解密
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(result);
System.out.println("jdk aes desrypt:" + new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、AES对称加密算法消息传递规则:
四、PBE加密算法
1、概述
PBE算法结合了消息摘要算法和对称加密算法的优点。PBE是基于口令的加密
对称加密算法之PBE的特点概述,本质上是对DES/3DES/AES对称加密算法的包装,不是新的算法,不过也是最为牛逼的一种方式。
盐:指加密的随机字符串或者口令等,也可以人为是一些扰码,防止密码的暴力破解
2、PBE算法的规则:
加密算法安全等级:PBE>AES>3DES>DES
3、JDK实现PBE加密解密算法
package com.webcode.cn.des;
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;
import org.apache.commons.codec.binary.Base64;
public class PBE {
static String string = "wen-min";
public static void main(String[] args) {
PBE.jdkPBE();
}
public 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);
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
byte[] result = cipher.doFinal(string.getBytes());
System.out.println("jdk PBE encrypt: " + Base64.encodeBase64String(result));
//解密
//初始化
cipher.init(Cipher.DECRYPT_MODE, key,pbeParameterSpec);
result = cipher.doFinal(result);
System.out.println("jdk PBE decrypt: " + new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:
jdk PBE encrypt: GAIay1DowQQ=
jdk PBE decrypt: wen-min
4、PBE加密算法的消息传递机制
JAVA实现对称加密的更多相关文章
- AES —— JAVA中对称加密和解密
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...
- 使用java实现对称加密解密(AES),非对称加密解密(RSA)
对称加密:双方采用同样的秘钥进行加密和解密.特点是速度快,但是安全性没有非对称加密高 非对称加密:接收方生成的公有秘钥公布给发送方,发送方使用该公有秘钥加密之后,发送给接收方,然后接收方使用私有秘钥解 ...
- java对称加密(AES)
java对称加密(AES) 博客分类: Java javaAES对称加密 /** * AESHelper.java * cn.com.songjy.test * * Function: TODO * ...
- Java和.NET使用DES对称加密的区别
Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...
- Java安全之对称加密、非对称加密、数字签名
原文地址: http://blog.csdn.net/furongkang/article/details/6882039 Java中加密分为两种方式一个是对称加密,另一个是非对称加密.对称加密是因为 ...
- 对称加密详解,以及JAVA简单实现
(原) 常用的加密有3种 1.正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现在一般用这种方式加密都会加上盐值. 2.对称加密,通过一个固定的对称密钥 ...
- Java加密与解密笔记(二) 对称加密
前面的仅仅是做了编码或者摘要,下面看看真正的加密技术. DES public class DESUtil { static final String ALGORITHM = "DES&quo ...
- java的AES对称加密和解密,有偏移量
import java.math.BigDecimal; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; i ...
- java中的数据加密2 对称加密
对称加密 也叫私钥加密. 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 需要对加密和解密使用相同密钥的加密算法.由于其速度快,对 ...
随机推荐
- STM32 TIM高级定时器死区时间的计算
STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...
- [hdu4670 Cube number on a tree]点分治
题意:给一个N个带权节点的树,权值以给定的K个素数为因子,求路径上节点乘积为立方数的路径条数 思路:立方数的性质是每个因子的个数为3的倍数,那么每个因子只需要保存0-2三个状态即可,然后路径就可以转化 ...
- [codeforces 200 A Cinema]暴力,优化
题意大致是这样的:有一个有n行.每行m个格子的矩形,每次往指定格子里填石子,如果指定格子里已经填过了,则找到与其曼哈顿距离最小的格子,然后填进去,有多个的时候依次按x.y从小到大排序然后取最小的.输出 ...
- 关于QQ可以发消息但是网页刷不出来问题
相信很多人都遇到过这个问题,明明可以登陆QQ,但是网页就是打不开,而且这种情况经常伴有网卡图标显示叹号的情况.笔者这里就教你一个方法,保证好用. 首先,在开始菜单输入cmd,在命令符模式下点击右键选择 ...
- [tgpl]go匿名函数
[tgpl]go匿名函数 0. 定义 匿名函数顾名思义是没有名字的函数, Named functions can be declared only at the package level, but ...
- How to delete the eclipse plugin.
click Help-->installation Details 2. choose the plugin that you want to delete.Then click uninst ...
- 腾讯几款QQ软件
1.QQ(普通版QQ) https://im.qq.com/ 2.Tim(QQ办公简洁版) https://tim.qq.com/ https://baike.baidu.com/item/Tim/2 ...
- Django视图函数之FBV与CBV模式
FBV模式: FBV(function base views) 就是在视图里使用函数处理请求. 一般直接用函数写的都属于是FBV模式. veiws.py from django.shortcuts i ...
- SpringBoot之整合MongoDB
MongoDB官网安装:https://www.mongodb.com/download-center/community MongoDB客户端工具(Mongo Management Studio)安 ...
- 201771010128王玉兰《面向对象与程序设计(java)第十五周学习总结》
第一部分:理论知识 一:JAR文件 Java程序的打包:程序编译完成后,程序员 将.class文件压缩打包为.jar文件后,GUI界面 程序就可以直接双击图标运行. jar文件(Java归档)既可以包 ...