本RSAUtils类的实现是基于糊涂工具类实现的,糊涂工具
在使用下面代码之前一定要导入Hutool的jar包或者maven坐标,我使用的是maven导入的。

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.18</version>
</dependency>

代码如下:

public class RSAUtils {

    /**
     * 类型
     */
    public static final String ENCRYPT_TYPE = "RSA";

    /**
     * 从文件中读取公钥
     * @param filename 公钥保存路径
     * @return 公钥字符串
     * @throws Exception
     */
    public static String getPublicKey(String filename) throws Exception {
        //默认UTF-8编码,可以在构造中传入第二个参数做为编码
        FileReader fileReader = new FileReader(filename);
        String result = fileReader.readString();
        return result;
    }

    /**
     * 从文件中读取密钥
     * @param filename 私钥保存路径
     * @return 私钥字符串
     * @throws Exception
     */
    public static String getPrivateKey(String filename) throws Exception {
        //默认UTF-8编码,可以在构造中传入第二个参数做为编码
        FileReader fileReader = new FileReader(filename);
        String result = fileReader.readString();
        return result;
    }

    /**
     * 公钥加密
     * @param content   要加密的内容
     * @param publicKey 公钥
     */
    public static String encrypt(String content, PublicKey publicKey) {
        try {
            RSA rsa = new RSA(null, publicKey);
            return rsa.encryptBase64(content, KeyType.PublicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 公钥加密
     * @param content   要加密的内容
     * @param publicKey 公钥
     */
    public static String encrypt(String content, String publicKey) {
        try {
            RSA rsa = new RSA(null, publicKey);
            return rsa.encryptBase64(content, KeyType.PublicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 私钥解密
     * @param content    要解密的内容
     * @param privateKey 私钥
     */
    public static String decrypt(String content, PrivateKey privateKey) {
        try {
            RSA rsa = new RSA(privateKey, null);
            return rsa.decryptStr(content, KeyType.PrivateKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 私钥解密
     * @param content    要解密的内容
     * @param privateKey 私钥
     */
    public static String decrypt(String content, String privateKey) {
        try {
            RSA rsa = new RSA(privateKey, null);
            return rsa.decryptStr(content, KeyType.PrivateKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取公私钥-请获取一次后保存公私钥使用
     * @param publicKeyFilename 公钥生成的路径
     * @param privateKeyFilename 私钥生成的路径
     */
    public static void generateKeyPair(String publicKeyFilename, String privateKeyFilename) {
        try {
            KeyPair pair = SecureUtil.generateKeyPair(ENCRYPT_TYPE);
            PrivateKey privateKey = pair.getPrivate();
            PublicKey publicKey = pair.getPublic();
            // 获取 公钥和私钥 的 编码格式(通过该 编码格式 可以反过来 生成公钥和私钥对象)
            byte[] pubEncBytes = publicKey.getEncoded();
            byte[] priEncBytes = privateKey.getEncoded();

            // 把 公钥和私钥 的 编码格式 转换为 Base64文本 方便保存
            String pubEncBase64 = new BASE64Encoder().encode(pubEncBytes);
            String priEncBase64 = new BASE64Encoder().encode(priEncBytes);

            FileWriter pub = new FileWriter(publicKeyFilename);
            FileWriter pri = new FileWriter(privateKeyFilename);
            pub.write(pubEncBase64);
            pri.write(priEncBase64);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试代码如下:

class SpringbootApplicationTests {

    String publicKeyFilename = "F:\\rsa\\publicKey.txt";
    String privateKeyFilename = "F:\\rsa\\privateKey.txt";

    @Test
    void test1() throws Exception {
        String publicKey = RSAUtils.getPublicKey(publicKeyFilename);
        String privateKey = RSAUtils.getPrivateKey(privateKeyFilename);
        System.out.println("读取的公钥是:" + publicKey);
        System.out.println("读取的私钥是:" + privateKey);

        //公钥加密
        String encrypt = RSAUtils.encrypt("加密的内容", publicKey);
        System.out.println("获取的加密串:" + encrypt);
        //私钥解密
        String decrypt = RSAUtils.decrypt(encrypt, privateKey);
        System.out.println("解密之后的数据:" + decrypt);


    }

}

测试结果是:

读取的公钥是:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCB5N0xQn0Bfv578aDg4U2AOfudNygA69/xvj1i
Ei0URCruqY4XXAaNf6+Wlm16wzvKCcxl/wACnD8L1bFRGfLIiyrmkg0QynsyOZloO4o+BmNnnKMP
fdpleaEAiGqAH16TO1uMH10FznLAGWQ5/chPn5gLgnz7iQbUT4vehw9QWQIDAQAB
读取的私钥是:MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIHk3TFCfQF+/nvxoODhTYA5+503
KADr3/G+PWISLRREKu6pjhdcBo1/r5aWbXrDO8oJzGX/AAKcPwvVsVEZ8siLKuaSDRDKezI5mWg7
ij4GY2ecow992mV5oQCIaoAfXpM7W4wfXQXOcsAZZDn9yE+fmAuCfPuJBtRPi96HD1BZAgMBAAEC
gYAKFhx687/DOvpF45hrffNHrrj0F1Fa6PYFzpDzqZeoiDaRO8dV1waHPFAFMH8l1j0xTht6HBgD
G+DlaV2Qf6RTg1xfO7qphIGlcI8bGgrmIPfxgmYKiTxBn1cVE043i2vMO/wLxKcaiGPpihrkfQFc
2I08gr3SnGRKyBNHeUq/EQJBAN80liE9PqXTaWSV+A2QsOhGccJQN2pFzeqef+oBUsWHkhAwLT5l
xpYP49MwnucLoPEhHyAcJr7WLnMGU9bR5SUCQQCU+o9quu6bapEIsvfLE3MRB8ISfHMALF47UVvt
X9P6WDQ9HTJ5mKo+WZuhyNRkEAtlq3Au80AHQ8FCSOWpIsolAj9Gn1zhJ3+q+DlgmhLiN+XBmIhl
8vuVpICCu6O9Zq3J0htlA9lM5ObwlBaBu+CLOiKyKMiwYDfiKeKIgngEgGUCQGxfYJipZw2TlfGY
Dv2hJmFLHXhJI3cKz3mjE5Y30YIZS9bxOFiQH7e/g6FK8IXhzgilj7P3q6odNaa8VKSW9CkCQQDS
GxaEW5ryqpVJ0lZwL59Ben+XsXWQwWYyYrko9Yg2EnMC5XkNE74l8w69NMyrQUfQO6tPqHkwtXlV
lnxbmnbo
获取的加密串:OCEurVbQNnBs0YOOtfKmuEX9y1qVsssRHCvKBu4roVB84p8rs0VAzJKAeb4opQ6U6D0uLAncLCjY1esHXm35/ep2ypbaErg3Piz5jTkBSAgyRCymz1cA1ie0uy/YP5Veli+ttxNDnRU8moQ+m2K2aU9L7Pv3jWrQW3DM0EWmX3A=
解密之后的数据:加密的内容

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐