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加密算法的消息传递机制



免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM