26.RSA加密解密在Java项目中的简单应用

作这个加密解密我是在网上找了好多的东西以为都不大合适,因而本身整理了一下这个加密与解密的过程,同时把加解密与MD5的那个工具类都放出来,至于原理什么的在前面的MD文章里面已经说了一个大概java

1.直接看以下测试代码

public static void main(String[] args) {
        SpringApplication.run(WhblogApplication.class, args);
//        1.测试MD5
//        String password = "starry12345";
//        System.out.println(WHEncryptTools.MD5Encode(password,"utf-8")+"md5的加密是");
//        2.测试RSA
        try {
            KeyPair keyPair = WHEncryptTools.genKeyPair(1024);
            PrivateKey privateKey = keyPair.getPrivate();
            WHEncryptTools.saveKeyAsPemFormat(privateKey,"rsa_private_key.pem");
            System.out.println("新建私钥是:"+new String(Base64.getEncoder().encode(privateKey.getEncoded())));

            PublicKey publicKey = keyPair.getPublic();
            WHEncryptTools.saveKeyAsPemFormat(publicKey,"rsa_public_key.pem");
            System.out.println("新建公钥是:"+new String(Base64.getEncoder().encode(publicKey.getEncoded())));

            PrivateKey privateKey2 = WHEncryptTools.getPemPrivateKey("rsa_private_key.pem","RSA");
            System.out.println("读取私钥是:"+new String(Base64.getEncoder().encode(privateKey2.getEncoded())));

            PublicKey publicKey2 = WHEncryptTools.getPemPublicKey("rsa_public_key.pem");
            System.out.println("读取公钥是:"+new String(Base64.getEncoder().encode(publicKey2.getEncoded())));

            String teststr = "leewihong";
            byte [] testhello = WHEncryptTools.RSAEncrypt(teststr.getBytes(),publicKey);
            System.out.println("加密后:"+new String(testhello));

            byte [] decryhello = WHEncryptTools.RSADecrypt(testhello,privateKey);
            System.out.println("解密后:"+new String(decryhello));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
复制代码

这段代码是包含有MD5的测试在里头的,MD5想要测试直接把注释去掉就能够了的git

2.封装的工具类以下代码所示

package com.gz.whblog.utils;

import javax.crypto.Cipher;
import java.io.*;
import java.security.*;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMReader;
import org.bouncycastle.openssl.PEMWriter;
import org.bouncycastle.util.io.pem.PemObject;


public class WHEncryptTools {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }
    private static final String hexDigIts[] = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};

    /**
    * @description: MD5加密,用于存储在数据库中的密码是MD5加密的
    *
    * @return: md5加密后的32位字符串
    **/
    public static String MD5Encode(String orign,String charsetname){
        String resultString = null;
        try {
            resultString = new String(orign);
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || charsetname.equals("")){
                resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
            }
            else {
                resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return resultString;
    }

    public static String byteArrayToHexString(byte b[]){
        StringBuffer resultSb = new StringBuffer();
        for(int i = 0; i < b.length; i++){
            resultSb.append(byteToHexString(b[i]));
        }
        return resultSb.toString();
    }

    public static String byteToHexString(byte b){
        int n = b;
        if(n < 0){
            n += 256;
        }
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigIts[d1] + hexDigIts[d2];
    }

    /**
    * @description: RSA加密,生成密钥对
    *
    * @return:
    **/
    public static KeyPair genKeyPair(int KeyLength) throws Exception{
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        return keyPairGenerator.generateKeyPair();
    }

    /**
    * @description: 把生成的公钥私钥文件保存为PEM文件
    *
    * @return: 
    **/
    public static void saveKeyAsPemFormat(Key key, String pem) throws IOException {
        PEMWriter pemWriter = new PEMWriter(new FileWriter(pem));
        pemWriter.writeObject(key);
        pemWriter.flush();
        pemWriter.close();
    }

    /**
    * @description: 从项目文件结构中获取私钥pem文件
    *
    * @return: 
    **/
    public static PrivateKey getPemPrivateKey(String filename, String algorithm) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader(filename));
        Security.addProvider(new BouncyCastleProvider());
        PEMReader pp = new PEMReader(br);
        PemObject pem = pp.readPemObject();
        byte[] content = pem.getContent();
        pp.close();

        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(content);
        KeyFactory kf = KeyFactory.getInstance(algorithm);
        return kf.generatePrivate(spec);
    }

    /**
    * @description: 从项目文件夹获取公钥pem文件
    *
    * @return:
    **/
    public static PublicKey getPemPublicKey(String pubKeyStr) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
        BufferedReader br = new BufferedReader(new FileReader(pubKeyStr));
        Security.addProvider(new BouncyCastleProvider());
        PEMReader pp = new PEMReader(br);
        PemObject pem = pp.readPemObject();
        byte[] content = pem.getContent();
        pp.close();

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(content);
        RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec);
        return pubKey;
    }

    /**
    * @description: 公钥加密返回加密数据
    *
    * @return:
    **/

    public static byte[] RSAEncrypt(byte[] content, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");// java默认"RSA"="RSA/ECB/PKCS1Padding"
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(content);
    }

    /**
    * @description: // 私钥解密获得返回的真实数据
    *
    * @return:
    **/

    public static byte[] RSADecrypt(byte[] content, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(content);
    }
    
}
复制代码

3.第三方依赖以下

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15 -->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15</artifactId>
            <version>1.46</version>
        </dependency>
复制代码

4.输出结果以下所示

写的很差的地方,恳请大神斧正,谢谢。。。。

Github同步更新我的学习笔记,若是这篇文章对你有好处点个星星你不亏 WiHongNoteBookgithub

相关文章
相关标签/搜索