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


  • 相关阅读:
    C#中类与结构体的区别
    计算机快捷键
    ArcSDE简单介绍
    SQLServer存储过程
    (ArcGIS Server10.0)Windows无法启动ArcGIS Server Object Manager服务(位于本地计算机上)。错误1067
    安装arcgis10.0出现localhost上运行的许可管理器版本不正确
    地理空间数据获取(二)
    地理空间数据免费获取(一)
    angular实现对百度天气api跨域请求
    angular实现跨域
  • 原文地址:https://www.cnblogs.com/wushaopei/p/11979154.html
Copyright © 2020-2023  润新知