个人博客网: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算法的密钥.
  1. package com.webcode.cn.des;
  2. import java.security.Key;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.KeyGenerator;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.SecretKeyFactory;
  7. import javax.crypto.spec.DESKeySpec;
  8. import org.apache.commons.codec.binary.Hex;
  9. public class DES {
  10. static String string = "wen-min";
  11. public static void main(String[] args) {
  12. DES.jdkDES();
  13. }
  14. public static void jdkDES() {
  15. try {
  16. // 生成key//返回生成指定算法密钥的KeyGenerator对象
  17. KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
  18. keyGenerator.init(56);//初始化此密钥生成器,使其具有确定的密钥大小
  19. SecretKey secretKey = keyGenerator.generateKey();//生成一个密钥
  20. byte[] bs = secretKey.getEncoded();
  21. // key转换
  22. DESKeySpec desKeySpec = new DESKeySpec(bs); //实例化DES密钥规则
  23. SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); //实例化密钥工厂
  24. Key convertSecretKey = factory.generateSecret(desKeySpec); //生成密钥
  25. // 加密
  26. Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
  27. cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
  28. byte[] result = cipher.doFinal(string.getBytes());
  29. System.out.println("jdk des encrypt:" + Hex.encodeHexString(result));
  30. // 解密
  31. cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
  32. result = cipher.doFinal(result);
  33. System.out.println("jdk des decrypt:" + new String(result));
  34. } catch (Exception e) {
  35. // TODO: handle exception
  36. e.printStackTrace();
  37. }
  38. }
  39. }

执行结果:

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对应算法其默认的密钥长度.

  1. package com.webcode.cn.des;
  2. import java.security.Key;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.KeyGenerator;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.SecretKeyFactory;
  7. import javax.crypto.spec.DESKeySpec;
  8. import javax.crypto.spec.DESedeKeySpec;
  9. import org.apache.commons.codec.binary.Hex;
  10. public class DES_three {
  11. static String string = "wen-min";
  12. public static void main(String[] args) {
  13. DES_three.jdkDES();
  14. }
  15. public static void jdkDES() {
  16. try {
  17. // 生成key//返回生成指定算法密钥的KeyGenerator对象
  18. KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
  19. keyGenerator.init(168);//初始化此密钥生成器,使其具有确定的密钥大小
  20. SecretKey secretKey = keyGenerator.generateKey();//生成一个密钥
  21. byte[] bs = secretKey.getEncoded();
  22. // key转换
  23. DESedeKeySpec desKeySpec = new DESedeKeySpec(bs); //实例化DES密钥规则
  24. SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); //实例化密钥工厂
  25. SecretKey convertSecretKey = factory.generateSecret(desKeySpec); //生成密钥
  26. // 加密
  27. Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
  28. cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
  29. byte[] result = cipher.doFinal(string.getBytes());
  30. System.out.println("jdk 3des encrypt:" + Hex.encodeHexString(result));
  31. // 解密
  32. cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
  33. result = cipher.doFinal(result);
  34. System.out.println("jdk 3des decrypt:" + new String(result));
  35. } catch (Exception e) {
  36. // TODO: handle exception
  37. e.printStackTrace();
  38. }
  39. }
  40. }

执行结果:

  1. jdk 3des encrypt:0656fdb061c86e8a
  2. jdk 3des decrypt:wen-min

三、对称加密算法AES

1、概述

AES是DES的高级替代,也是目前使用最多的对称加密算法

DES有漏洞,所以,产生了3重DES<br>
3重DES的效率比较低,所以产生了AES<br>

AES的特点是:

  • 使用的更为广泛
  • 目前还没有被破解
  • 通常用与移动通信系统加密和SSH协议的软件加密

2、AES的使用规则:

3、JDK实现AES加密解密算法:

  1. package com.webcode.cn.des;
  2. import java.security.Key;
  3. //import java.util.Base64;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.KeyGenerator;
  6. import javax.crypto.SecretKey;
  7. import javax.crypto.spec.SecretKeySpec;
  8. import org.apache.commons.codec.binary.Base64;
  9. //import org.bouncycastle.util.encoders.Base64;
  10. public class AES {
  11. static String string = "wen-min";
  12. public static void main(String[] args) {
  13. AES.jdkAES();
  14. }
  15. public static void jdkAES(){
  16. try {
  17. //生成key
  18. KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  19. //设置密钥长度
  20. keyGenerator.init(128);
  21. //生成密钥对象
  22. SecretKey secretKey = keyGenerator.generateKey();
  23. //获取密钥
  24. byte[] keyBytes = secretKey.getEncoded();
  25. //key转换
  26. Key key = new SecretKeySpec(keyBytes,"AES");
  27. //加密
  28. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  29. //初始化,设置为加密
  30. cipher.init(Cipher.ENCRYPT_MODE, key);
  31. byte[] result = cipher.doFinal(string.getBytes());
  32. System.out.println("jdk aes encrypt: " + Base64.encodeBase64String(result));
  33. //初始化,设置为解密
  34. cipher.init(Cipher.DECRYPT_MODE, key);
  35. result = cipher.doFinal(result);
  36. System.out.println("jdk aes desrypt:" + new String(result));
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

4、AES对称加密算法消息传递规则:

四、PBE加密算法

1、概述

PBE算法结合了消息摘要算法和对称加密算法的优点。PBE是基于口令的加密

对称加密算法之PBE的特点概述,本质上是对DES/3DES/AES对称加密算法的包装,不是新的算法,不过也是最为牛逼的一种方式。
:指加密的随机字符串或者口令等,也可以人为是一些扰码,防止密码的暴力破解

2、PBE算法的规则:

加密算法安全等级:PBE>AES>3DES>DES

3、JDK实现PBE加密解密算法

  1. package com.webcode.cn.des;
  2. import java.security.Key;
  3. import java.security.SecureRandom;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.SecretKeyFactory;
  6. import javax.crypto.spec.PBEKeySpec;
  7. import javax.crypto.spec.PBEParameterSpec;
  8. import org.apache.commons.codec.binary.Base64;
  9. public class PBE {
  10. static String string = "wen-min";
  11. public static void main(String[] args) {
  12. PBE.jdkPBE();
  13. }
  14. public static void jdkPBE() {
  15. try {
  16. //初始化盐
  17. SecureRandom random = new SecureRandom();
  18. byte[] salt = random.generateSeed(8);
  19. // 加 密 口令与密钥
  20. String password = "imooc";
  21. PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
  22. SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
  23. Key key = factory.generateSecret(pbeKeySpec);
  24. //加密
  25. PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt,100);
  26. Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
  27. cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
  28. byte[] result = cipher.doFinal(string.getBytes());
  29. System.out.println("jdk PBE encrypt: " + Base64.encodeBase64String(result));
  30. //解密
  31. //初始化
  32. cipher.init(Cipher.DECRYPT_MODE, key,pbeParameterSpec);
  33. result = cipher.doFinal(result);
  34. System.out.println("jdk PBE decrypt: " + new String(result));
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }

执行结果:

  1. jdk PBE encrypt: GAIay1DowQQ=
  2. jdk PBE decrypt: wen-min

4、PBE加密算法的消息传递机制

JAVA实现对称加密的更多相关文章

  1. AES —— JAVA中对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  2. 使用java实现对称加密解密(AES),非对称加密解密(RSA)

    对称加密:双方采用同样的秘钥进行加密和解密.特点是速度快,但是安全性没有非对称加密高 非对称加密:接收方生成的公有秘钥公布给发送方,发送方使用该公有秘钥加密之后,发送给接收方,然后接收方使用私有秘钥解 ...

  3. java对称加密(AES)

    java对称加密(AES) 博客分类: Java javaAES对称加密  /** * AESHelper.java * cn.com.songjy.test * * Function: TODO * ...

  4. Java和.NET使用DES对称加密的区别

    Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...

  5. Java安全之对称加密、非对称加密、数字签名

    原文地址: http://blog.csdn.net/furongkang/article/details/6882039 Java中加密分为两种方式一个是对称加密,另一个是非对称加密.对称加密是因为 ...

  6. 对称加密详解,以及JAVA简单实现

    (原) 常用的加密有3种 1.正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现在一般用这种方式加密都会加上盐值. 2.对称加密,通过一个固定的对称密钥 ...

  7. Java加密与解密笔记(二) 对称加密

    前面的仅仅是做了编码或者摘要,下面看看真正的加密技术. DES public class DESUtil { static final String ALGORITHM = "DES&quo ...

  8. java的AES对称加密和解密,有偏移量

    import java.math.BigDecimal; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; i ...

  9. java中的数据加密2 对称加密

    对称加密 也叫私钥加密.   采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 需要对加密和解密使用相同密钥的加密算法.由于其速度快,对 ...

随机推荐

  1. mysql优化–explain分析sql语句执行效率

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...

  2. 读源码之Spring 核心内容

    为什么有这篇文档 工作两三年之后,总感觉什么东西都懂,但是什么东西又都不会.所以日常学习是很有必要的,俗话说学而不思则罔 ,思而不学则殆.所以我们要学思结合,学习的方法有很多,但是思考的深度或者说有没 ...

  3. MySQL 入门(4):锁

    摘要 在这篇文章中,我将从上一篇的一个小例子开始,跟你介绍一下InnoDB中的行锁. 在这里,会涉及到一个概念:两阶段加锁协议. 之后,我会介绍行锁中的S锁和X锁,以及这两种锁的作用. 但是我们会发现 ...

  4. 【原理探究】女朋友问我ArrayList遍历时删除元素的正确姿势是什么?

    简介 我们在项目开发过程中,经常会有需求需要删除ArrayList中的某个元素,而使用不正确的删除方式,就有可能抛出异常.或者在面试中,会遇到面试官询问遍历时如何正常删除元素.所以在本篇文章中,我们会 ...

  5. linux(ubuntu) 1045, "Access denied for user 'root'@'localhost' (using password: YES)"

    问题现象: 最近使用 flask 的 sqlalchemy 框架,在链接数据库(mysql)时出现报错 sqlalchemy.exc.OperationalError: (pymysql.err.Op ...

  6. fragment hide/show 生命周期

    Fragment的使用越来越普遍了,掌握它的生命周期以及注意事项时非常有必要的,首先 All subclasses of Fragment must include a public empty co ...

  7. search(14)- elastic4s-统计范围:global, filter,post-filter bucket

    聚合一般作用在query范围内.不带query的aggregation请求实际上是在match_all{}查询范围内进行统计的: GET /cartxns/_search { "aggs&q ...

  8. 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场

    上一篇文章(https://www.cnblogs.com/meowv/p/12896898.html)已经成功将博客项目跑起来了,那么本篇主要是将之前遗留的问题解决,现在的代码看起来可能还是比较混乱 ...

  9. 使用urllib

    urlopen的基本用法: 工具为:python3(windows) 其完整表达式为: urllib.request.urlopen(url, data=None, [timeout, ]*, caf ...

  10. js得到文件后缀

    js得到文件后缀  http://www.cnblogs.com/lan0725/archive/2010/05/25/1873745.html function getFileExt(str) {  ...