1

时间:2017年4月11日星期二
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:https://github.com/zccodere/s...
个人学习源码:https://github.com/zccodere/s...

第一章:对称加密算法DES

1-1 JAVA对称加密算法DES

加密密钥=解密密钥

对称加密算法

初等
DES
    --3DES
AES
PBE
IDEA

算法实现:

clipboard.png

代码演示:

package com.myimooc.security.des;

import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

/**
 * DES对称加密演示
 * Created by ZC on 2017/4/11.
 */
public class DemoDES {
    /** 待加密字符串 */
    private static String src="imooc security des";

    public static void main(String[] args){
        jdkDES();
        bcDES();
    }

    /** 使用 jdk 实现des加解密 */
    public static void jdkDES(){
        try {
            // 生成KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
            keyGenerator.init(56);
            SecretKey secretKey = keyGenerator.generateKey();
            byte[] byteKey = secretKey.getEncoded();

            // KEY转换
            DESKeySpec desKeySpec = new DESKeySpec(byteKey);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            Key convertSecretKey = secretKeyFactory.generateSecret(desKeySpec);

            // 加密
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE,convertSecretKey);
            byte[] result = cipher.doFinal(src.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) {
            e.printStackTrace();
        }
    }

    /** 使用BouncyCastle实现DES加解密 */
    public static void bcDES(){
        try {
            Security.addProvider(new BouncyCastleProvider());

            // 生成KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DES","BC");
            keyGenerator.init(56);
            SecretKey secretKey = keyGenerator.generateKey();
            byte[] byteKey = secretKey.getEncoded();

            // KEY转换
            DESKeySpec desKeySpec = new DESKeySpec(byteKey);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            Key convertSecretKey = secretKeyFactory.generateSecret(desKeySpec);

            // 加密
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE,convertSecretKey);
            byte[] result = cipher.doFinal(src.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) {
            e.printStackTrace();
        }
    }
}

流程演示:

clipboard.png

第二章:对称加密算法3DES

2-1 JAVA对称加密算法3DES

为什么会有3重DES,DES的劣势

1.违反柯克霍夫原则
2.安全问题

3重DES的好处

1.密钥长度增强
2.迭代次数提高

算法实现:

clipboard.png

代码演示:

package com.myimooc.security.des;

import org.apache.commons.codec.binary.Hex;

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 java.security.Key;
import java.security.SecureRandom;

/**
 * 3DES对称加密演示
 * Created by ZC on 2017/4/11.
 */
public class Demo3DES {

    /** 待加密字符串 */
    private static String src="imooc security 3des";

    public static void main(String[] args){
        jdk3des();
    }

    /** 使用jdk实现3重DES加解密 */
    private static void jdk3des(){
        try {
            // 生成KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
            //keyGenerator.init(168);
            keyGenerator.init(new SecureRandom());
            SecretKey secretKey = keyGenerator.generateKey();
            byte[] byteKey = secretKey.getEncoded();

            // KEY转换
            DESedeKeySpec desKeySpec = new DESedeKeySpec(byteKey);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DESede");
            Key convertSecretKey = secretKeyFactory.generateSecret(desKeySpec);

            // 加密
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE,convertSecretKey);
            byte[] result = cipher.doFinal(src.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) {
            e.printStackTrace();
        }
    }
}

第三章:对称加密算法AES

3-1 JAVA对称加密算法AES

JAVA对称加密算法:AES

AES是目前使用最多的对称加密算法
AES的优势之一是至今尚未被破解
AES通常用于移动通信系统加密以及基于SSH协议的软件
    比如:SSH Clint、secureCRT

AES算法

高级
DES替代者

算法实现:

clipboard.png

代码演示:

package com.myimooc.security.aes;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

/**
 * /**
 * AES对称加密演示
 * Created by ZC on 2017/4/11.
 */
public class DemoAES {

    /** 待加密字符串 */
    private static String src="imooc security aes";

    public static void main(String[] args){
        jdkAES();
    }

    /** 通过JDK实现AES对称加密 */
    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(src.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 decrypt:"+ new String(result));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

流程演示:

clipboard.png

第四章:对称加密算法PBE

4-1 JAVA对称加密算法PBE

PBE:综合性对称加密算法

PBE(Password Based Encyption)基于口令加密
对已有算法的包装
JDK、BC
盐
PBEWithMD5AndDES

算法实现:

clipboard.png

代码演示:

package com.myimooc.security.pbe;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import java.security.Key;
import java.security.SecureRandom;

/**
 * /**
 * /**
 * PBE对称加密演示
 * Created by ZC on 2017/4/11.
 */
public class DemoPBE {
    /** 待加密字符串 */
    private static String src="imooc security pbe";

    private static final String TOKEN = "imooc";

    public static void main(String[] args){
        jdkPBE();
    }

    /** 使用JDK实现PBE算法加解密 */
    public static void jdkPBE(){
        try{
            // 初始化盐
            SecureRandom random = new SecureRandom();
            byte[] salt = random.generateSeed(8);

            // 口令与密钥
            String password = TOKEN;
            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(src.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:"+ Base64.encodeBase64String(result));

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

流程演示:

clipboard.png

第五章:小结

5-1 对称加密算法小结

对称加密算法:回顾

初等
DES
    --3DES
AES
PBE

加密和解密不在同一方怎么办?

把密钥发给对方

妙手空空
1.3k 声望368 粉丝

博观而约取,厚积而薄发