java下密码学简单应用(附jdk11中文api文档)

一、前言

1、java加密体系,见Java加密体系(一)java.security包
2、jdk11中文api文档链接:https://pan.baidu.com/s/1Tz3rgSaBiwDgYy_Pjz4WxQ 提取码:8a0j

二、代码

1、查看提供商及其提供的算法

import java.security.Provider;
import java.security.Security;

public class Providers {

    public static void main(String[] args){

        int i = 1;
        for (Provider provider : Security.getProviders()){
            System.out.println(i + ": " + provider);
            for (Provider.Service service : provider.getServices()){
                System.out.println(service.getAlgorithm());
            }
            System.out.println();
            i++;
        }
    }
}

2、MessageDigest算法

①MD5

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import java.util.Calendar;

public class MD5 {
    
    //相应文件位mysql8.0.17安装文件,官方提供MD5如下
    private static final String MD5 = "d120bb0513c2ccfaeee74b0e99217bb7";

    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {

        Provider provider = Security.getProvider("SUN");
        MessageDigest md5MessageDigest = MessageDigest.getInstance("MD5", provider);
        
        File file = new File("E:/temp/mysql-8.0.17-winx64.zip");
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] data = fileInputStream.readAllBytes();
        fileInputStream.close();
        
        long beginTime = Calendar.getInstance().getTimeInMillis();
        byte[] digest = md5MessageDigest.digest(data);
        for (byte b : digest){
            System.out.printf("%x", b);
        }
        
        long endTime = Calendar.getInstance().getTimeInMillis();
        System.out.println("\n");
        System.out.println("digest time: " + (endTime - beginTime));
    }
}

②SHA3-512

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import java.util.Calendar;

public class SHA3 {

    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {

        Provider provider = Security.getProvider("SUN");
        MessageDigest md5MessageDigest = MessageDigest.getInstance("SHA3-512", provider);

        File file = new File("E:/temp/mysql-8.0.17-winx64.zip");
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] data = fileInputStream.readAllBytes();
        fileInputStream.close();

        long beginTime = Calendar.getInstance().getTimeInMillis();
        byte[] digest = md5MessageDigest.digest(data);
        for (byte b : digest){
            System.out.printf("%x", b);
        }

        long endTime = Calendar.getInstance().getTimeInMillis();
        System.out.println("\n");
        System.out.println(endTime - beginTime);
    }
}

我的电脑上MD5大概执行了:890ms,SHA-512时间为:1050ms,而SHA3-512为:3574ms

3、AES

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;

public class AES {

    // 使用的密码方案
    private static final String ALGORITHM_TRANSFORMATION = "AES/CBC/PKCS5Padding";

    // 密码参数,AES的CBC模式需要提供一个向量
    private static final String ALGORITHM_PARAMETERS = "5fsd25d82f56s24f";

    // 128位密钥
    private static final String KEY = "0123456789123456";

    public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, IOException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {

        // 大写变量来自本类定义,为常量
        Cipher encryptCipher = Cipher.getInstance(ALGORITHM_TRANSFORMATION);
        Cipher decryptCipher = Cipher.getInstance(ALGORITHM_TRANSFORMATION);

        // 创建参数类
        AlgorithmParameterSpec parameter = new IvParameterSpec(ALGORITHM_PARAMETERS.getBytes(StandardCharsets.US_ASCII));

        // 创建密钥,多种方式
        // 独立于提供商的密钥
        Key key = new SecretKeySpec(KEY.getBytes(StandardCharsets.US_ASCII), "AES");

        // 实现接口Key
        /*Key key = new Key() {
            @Override
            public String getAlgorithm() {
                return "AES";
            }

            @Override
            public String getFormat() {
                return "hello world";
            }

            @Override
            public byte[] getEncoded() {
                return KEY.getBytes(StandardCharsets.US_ASCII);
            }
        };*/

        // javax.crypto.KeyGenerator
        /*KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM_TRANSFORMATION);
        keyGenerator.init(128);
        Key key = keyGenerator.generateKey();*/

        encryptCipher.init(Cipher.ENCRYPT_MODE, key, parameter);
        decryptCipher.init(Cipher.DECRYPT_MODE, key, parameter);

        FileInputStream fileInputStream = new FileInputStream(new File("E:/test.jpg"));
        byte[] data = fileInputStream.readAllBytes();
        fileInputStream.close();

        byte[] encryptData = encryptCipher.doFinal(data);
        byte[] decryptData = decryptCipher.doFinal(encryptData);

        FileOutputStream fileOutputStream = new FileOutputStream(new File("E:/test2.jpg"));
        fileOutputStream.write(decryptData);
        fileInputStream.close();
    }
}

你可能感兴趣的:(计算机,java,密码学)