2021-06-05

非对称加密算法RSA的实现
package com.wezl.demo;

import com.sun.org.apache.xml.internal.security.utils.Base64;
import org.apache.commons.io.FileUtils;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * @PackageName: com.wezl.demo
 * @ClassName: RSAdemo
 * @Author: dongxingyaohui
 * @Date: 2021/6/5 18:40
 */
public class RSADemo {
    public static void main(String[] args) throws Exception {
       String res = "测试";
       String algorithm = "RSA";
       //生成公钥和私钥 ****(此方法第一次运行的时候只调用一次,后续注释 保证公钥和私钥只生成一次)****
        generateKeyToFile(algorithm,"a.pub","a.pri");
       //获取存储的公钥和私钥的key
        PrivateKey priKey = getPriKey("a.pri", algorithm);
        PublicKey pubKey = getPubKey("a.pub", algorithm);
        //对数据进行加密测试
        String encryptRSA = encryptRSA(algorithm, priKey, res);
        //对数据进行解密
        String decryptRSA = decryptRSA(algorithm, pubKey, encryptRSA);
        System.out.println(decryptRSA);

    }
    /**
     *  根目录下读取公钥
     * @param s 公钥文件名称
     * @param algorithm 加密规则
     * @return PublicKey 公钥key的对象
     * */
    private static PublicKey getPubKey(String s, String algorithm) throws Exception {
        String s1 = FileUtils.readFileToString(new File(s), Charset.defaultCharset());
       //创建key的对象
        KeyFactory instance = KeyFactory.getInstance(algorithm);
       //设置公钥的规则
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decode(s1));
        return instance.generatePublic(x509EncodedKeySpec);
    }

    /**
      * 根目录下读取私钥
      * @param s 私钥文件名
      * @param algorithm 加密方式
      * @return PrivateKey 秘钥的key的返回方式
      * */
    private static PrivateKey getPriKey(String s, String algorithm) throws Exception {
        String s1 = FileUtils.readFileToString(new File(s), Charset.defaultCharset());
        //创建key的工厂
        KeyFactory instance = KeyFactory.getInstance(algorithm);
        //创建私钥key的规则
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(s1));
        //获取私钥key
        PrivateKey privateKey = instance.generatePrivate(pkcs8EncodedKeySpec);
        return privateKey;
    }

    /**
     *  保存私钥和公钥到项目的根路径下
     * @param algorithm 加密方式
     * @param pubPath 公钥的保存地址
     * @param priPath 私钥的保存地址
     */

    public static void  generateKeyToFile(String algorithm,String pubPath,String priPath) throws NoSuchAlgorithmException, IOException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        //生成秘钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //获取公钥
        PublicKey aPublic = keyPair.getPublic();
        byte[] abytepublic = aPublic.getEncoded();
        // 对公钥进行编码
        String encodePublic = Base64.encode(abytepublic);
        //获取私钥
        PrivateKey aPrivate = keyPair.getPrivate();
        byte[] abyteprivate = aPrivate.getEncoded();
        String encodePrivate = Base64.encode(abyteprivate);
        FileUtils.writeStringToFile(new File(pubPath),encodePublic, Charset.forName("UTF-8"));
        FileUtils.writeStringToFile(new File(priPath),encodePrivate, Charset.forName("UTF-8"));
    }

    /**
     * 加密方法
     * @param algorithm 加密方式
     * @param aPrivate 秘钥(公钥或者私钥)
     * @param input  数据
     * */
    public static String encryptRSA(String algorithm,Key aPrivate,String input) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        // 创建加密对象
        Cipher instance = Cipher.getInstance(algorithm);
        //初始化加密对象 第一个参数 加密模式   第二个参数 你想使用公钥加密还是私钥加密
        //使用私钥进行加密
        instance.init(Cipher.ENCRYPT_MODE,aPrivate);
        //进行加密
        byte[] bytes = instance.doFinal(input.getBytes());
        String encode = Base64.encode(bytes);
        return encode;
    }

    /**
     * 解密方法
     * @param algorithm 加密方式
     * @param aPrivate 秘钥(公钥或者私钥)
     * @param encryPted 密文
     * */
    public static String decryptRSA(String algorithm,Key aPrivate,String encryPted) throws Exception{
        Cipher instance = Cipher.getInstance(algorithm);
        System.out.println("----------解密---------------");
        instance.init(Cipher.DECRYPT_MODE,aPrivate);
        byte[] decode = Base64.decode(encryPted);
        byte[] bytes1 = instance.doFinal(decode);
        return new String(bytes1);
    }


}

需要注意的是FileUtils 引用的commons.io下的包 依赖

   <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值