欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java对数据进行加密、解密

程序员文章站 2024-03-14 19:54:53
...

java对数据进行加密、解密

RSA不对称加密

关于base64可以参考我的上一篇博客: java Base64编码、解码

import org.springframework.util.StringUtils;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

/**
 * @author ListJiang
 * @class RSA加密工具类
 * @remark
 * @date 2020/9/14 19:56
 */
public class EncrypRSA {

    private static final String PUBLIC = "PUBLIC";
    private static final String PRIVATE = "PRIVATE";


    /**
     * 根据公钥加密
     *
     * @param publicKey      公钥
     * @param cleartextBytes 明文
     */
    public byte[] encrypt(RSAPublicKey publicKey, byte[] cleartextBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        if (publicKey != null) {
            //Cipher负责完成加密或解密工作,基于RSA
            Cipher cipher = Cipher.getInstance("RSA");
            //根据公钥,对Cipher对象进行初始化
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] resultBytes = cipher.doFinal(cleartextBytes);
            return resultBytes;
        }
        return null;
    }

    /**
     * 根据公钥加密
     *
     * @param publicKey 公钥
     * @param cleartext 明文
     * @return
     * @throws Exception
     */
    public byte[] encrypt(RSAPublicKey publicKey, String cleartext) throws Exception {
        if (publicKey != null) {
            return encrypt(publicKey, cleartext.getBytes());
        }
        return null;
    }

    /**
     * 指定加密类型进行加密
     *
     * @param key       **
     * @param cleartext 明文
     * @param keyType   加***类型,默认公钥加密
     * @return
     * @throws Exception
     */
    public byte[] encrypt(String key, String cleartext, String keyType) throws Exception {
        if (!StringUtils.isEmpty(key) && !StringUtils.isEmpty(keyType)) {
            switch (keyType) {
                case PUBLIC:
                    return encrypt(getPublicKey(key), cleartext.getBytes());
                case PRIVATE:
                    return encrypt(getPrivateKey(key), cleartext.getBytes());
            }
            return encrypt(getPublicKey(key), cleartext.getBytes());
        }
        return null;
    }

    /**
     * 根据私钥加密
     *
     * @param privateKey     私钥
     * @param cleartextBytes 明文
     */
    public byte[] encrypt(RSAPrivateKey privateKey, byte[] cleartextBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        if (privateKey != null) {
            //Cipher负责完成加密或解密工作,基于RSA
            Cipher cipher = Cipher.getInstance("RSA");
            //根据公钥,对Cipher对象进行初始化
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            byte[] resultBytes = cipher.doFinal(cleartextBytes);
            return resultBytes;
        }
        return null;
    }

    /**
     * 根据私钥加密
     *
     * @param privateKey 私钥
     * @param cleartext  明文
     */
    public byte[] encrypt(RSAPrivateKey privateKey, String cleartext) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        if (!StringUtils.isEmpty(privateKey)) {
            return encrypt(privateKey, cleartext.getBytes());
        }
        return null;
    }

    /**
     * 根据公钥解密
     *
     * @param publicKey       公钥
     * @param ciphertextBytes 密文
     */
    public byte[] decrypt(RSAPublicKey publicKey, byte[] ciphertextBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        if (publicKey != null) {
            //Cipher负责完成加密或解密工作,基于RSA
            Cipher cipher = Cipher.getInstance("RSA");
            //根据公钥,对Cipher对象进行初始化
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
            byte[] resultBytes = cipher.doFinal(ciphertextBytes);
            return resultBytes;
        }
        return null;
    }

    /**
     * 根据公钥解密
     *
     * @param publicKey  公钥
     * @param ciphertext 密文
     */
    public byte[] decrypt(RSAPublicKey publicKey, String ciphertext) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        if (publicKey != null) {
            return decrypt(publicKey, Base64.getDecoder().decode(ciphertext));
        }
        return null;
    }

    /**
     * 根据私钥解密
     *
     * @param privateKey 私钥
     * @param srcBytes   密文
     */
    public byte[] decrypt(RSAPrivateKey privateKey, byte[] srcBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        if (privateKey != null) {
            //Cipher负责完成加密或解密工作,基于RSA
            Cipher cipher = Cipher.getInstance("RSA");
            //根据公钥,对Cipher对象进行初始化
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] resultBytes = cipher.doFinal(srcBytes);
            return resultBytes;
        }
        return null;
    }

    /**
     * 根据私钥解密
     *
     * @param privateKey 私钥
     * @param ciphertext 密文
     */
    public byte[] decrypt(RSAPrivateKey privateKey, String ciphertext) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        if (privateKey != null) {
            return decrypt(privateKey, Base64.getDecoder().decode(ciphertext));
        }
        return null;
    }

    /**
     * 指定解密类型进行解密
     *
     * @param key        **
     * @param ciphertext 密文
     * @param keyType    **类型,默认私钥解密
     */
    public byte[] decrypt(String key, String ciphertext, String keyType) throws Exception {
        if (key != null) {
            byte[] decode = Base64.getDecoder().decode(ciphertext);
            switch (keyType){
                case PUBLIC:
                    return decrypt(getPublicKey(key), decode);
                case PRIVATE:
                    return decrypt(getPrivateKey(key), decode);
            }
            return decrypt(getPrivateKey(key), decode);
        }
        return null;
    }

    /**
     * 根据私钥解密为String
     *
     * @param privateKey      私钥
     * @param ciphertextBytes 密文
     */
    public String decryptToString(RSAPrivateKey privateKey, byte[] ciphertextBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        return new String(decrypt(privateKey, ciphertextBytes));
    }

    /**
     * 根据私钥解密为String
     *
     * @param privateKey 私钥
     * @param ciphertext 密文
     */
    public String decryptToString(RSAPrivateKey privateKey, String ciphertext) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        return new String(decrypt(privateKey, ciphertext));
    }

    /**
     * 根据**与**类型解密为 String
     *
     * @param key        **
     * @param ciphertext 密文
     * @param keyType    **类型
     */
    public String decryptToString(String key, String ciphertext, String keyType) throws Exception {
        if (key != null && !StringUtils.isEmpty(ciphertext) && !StringUtils.isEmpty(keyType)) {
            return new String(decrypt(key, ciphertext, keyType));
        }
        return null;
    }

    /**
     * 根据公钥解密为String
     *
     * @param publicKey
     * @param srcBytes
     * @return
     */
    public String decryptToString(RSAPublicKey publicKey, byte[] srcBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        return new String(decrypt(publicKey, srcBytes));
    }

    /**
     * String转公钥PublicKey
     *
     * @param key
     * @return
     * @throws Exception
     */
    private static RSAPublicKey getPublicKey(String key) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(key);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
        return publicKey;
    }

    /**
     * 公钥转 String
     *
     * @param publicKey
     * @return
     */
    private static String getString(RSAPublicKey publicKey) {
        return Base64.getEncoder().encodeToString(publicKey.getEncoded());
    }

    /**
     * String转私钥PrivateKey
     *
     * @param key
     * @return
     * @throws Exception
     */
    private static RSAPrivateKey getPrivateKey(String key) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(key);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
        return privateKey;
    }

    /**
     * 私钥转 String
     *
     * @param privateKey
     * @return
     */
    private static String getString(RSAPrivateKey privateKey) {
        return Base64.getEncoder().encodeToString(privateKey.getEncoded());
    }

    public static void main(String[] args) throws Exception {
        EncrypRSA rsa = new EncrypRSA();
        String msg = "[email protected]#$%^&*()_+1234567890-=/*-+|,。/、!@#¥%……&((()——+";
        //KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        //初始化**对生成器,**大小为1024位
        keyPairGen.initialize(1024);
        //生成一个**对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        //得到私钥
        byte[] encrypt = rsa.encrypt((RSAPublicKey) keyPair.getPublic(), "".getBytes());
        String privateStr = getString((RSAPrivateKey) keyPair.getPrivate());
        String publicStr = getString((RSAPublicKey) keyPair.getPublic());
        System.out.println("私钥是:"+privateStr);
        System.out.println("公钥是:"+publicStr);
        byte[] ciphertextPrivate = rsa.encrypt(privateStr, msg, EncrypRSA.PRIVATE);
        byte[] ciphertextPublic = rsa.encrypt(publicStr, msg, EncrypRSA.PUBLIC);
        System.out.println("原文是———————————————:"+msg);
        String cleartextPrivate = rsa.decryptToString(privateStr, new String(Base64.getEncoder().encode(ciphertextPublic)), EncrypRSA.PRIVATE);
        String cleartextPublic = rsa.decryptToString(publicStr,  new String(Base64.getEncoder().encode(ciphertextPrivate)),EncrypRSA.PUBLIC);
        System.out.println("私钥加密公钥解密后明文为:"+cleartextPrivate);
        System.out.println("公钥加密私钥解密后明文为:"+cleartextPublic);
    }
}