开罐即用系列-RSA加密解密

用途:适用于少量数据的加密解密(RSA加密特点:安全性高、成熟度高、速度慢、资源消耗高)

第一步:工具类(2个)

RSA工具类

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * RSA工具类
 * @author szw
 * @version 1.0
 * @since JDK1.8
 */
public class RSAUtil {
    private static KeyPair keyPair;
    private static String publicKeyStr;
    private static String privateKeyStr;

    public static String getPublicKeyStr() {
        return publicKeyStr;
    }

    public static void setPublicKeyStr(String publicKeyStr) {
        RSAUtil.publicKeyStr = publicKeyStr;
    }

    public static String getPrivateKeyStr() {
        return privateKeyStr;
    }

    public static void setPrivateKeyStr(String privateKeyStr) {
        RSAUtil.privateKeyStr = privateKeyStr;
    }

    static {
        try {
            keyPair = getKeyPair();
        } catch (Exception e) {
            e.printStackTrace();
        }

        publicKeyStr = getPublicKey();
        privateKeyStr = getPrivateKey();
    }

    /**
     * 生成密钥对
     * @return
     * @throws Exception
     */
    private static KeyPair getKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        return keyPair;
    }

    /**
     * 获取公钥(Base64编码)
     * @return
     */
    private static String getPublicKey(){
        PublicKey publicKey = keyPair.getPublic();
        byte[] bytes = publicKey.getEncoded();
        return Base64Util.byteToBase64(bytes);
    }

    /**
     * 获取私钥(Base64编码)
     * @return
     */
    private static String getPrivateKey(){
        PrivateKey privateKey = keyPair.getPrivate();
        byte[] bytes = privateKey.getEncoded();
        return Base64Util.byteToBase64(bytes);
    }


    /**
     * 公钥加密
     * 加密后的内容经过了base64转码
     * @param msg
     * @return
     * @throws Exception
     */
    public static String publicEncrypt(String msg) throws Exception{
        byte[] content = msg.getBytes();
        byte[] keyBytes = Base64Util.base64ToBytes(publicKeyStr);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] bytes = cipher.doFinal(content);
        return Base64Util.byteToBase64(bytes);
    }

    /**
     * 私钥解密
     *
     * @param publicEncrypt 经过base64转码的密文
     * @return
     * @throws Exception
     */
    public static String privateDecrypt(String publicEncrypt) throws Exception{
        byte[] content = Base64Util.base64ToBytes(publicEncrypt);
        byte[] keyBytes = Base64Util.base64ToBytes(privateKeyStr);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] bytes = cipher.doFinal(content);
        return new String(bytes);
    }

}

base64工具类

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;

/**
 * base64工具类
 * @author szw
 * @version 1.0
 * @since JDK1.8
 */
public class Base64Util {

    /**
     * 将字节码转换成base64
     *
     * @param bytes
     * @return
     */
    public static String byteToBase64(byte[] bytes) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        return base64Encoder.encode(bytes);
    }

    /**
     * 将base64转换成字节码
     * @param base64
     * @return
     * @throws IOException
     */
    public static byte[] base64ToBytes(String base64) throws IOException {
        BASE64Decoder base64Decoder = new BASE64Decoder();
        return base64Decoder.decodeBuffer(base64);
    }
}

使用方式:

用工具类生成RSA密钥对保存起来:

String publicKeyStr = RSAUtil.getPublicKeyStr();
String privateKeyStr = RSAUtil.getPrivateKeyStr();

使用密钥对进行加密解密:

/**
 * 
 * @author sunziwen
 * 2018-08-13 11:04
 * @version 1.0
 **/
public class Main {
    public static void main(String args[]) throws Exception {
        String publicKeyStr = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5t9yr2YPa/Cmy2gUbItLxmSpkizcTH0z\n" +
                "YnBZ7x3n07HNuRPAe215tZtodfSoz9GxpLKgn9HrKan5zQN6ESJ2U21evcY0VZjWYMBY0X9oJNQq\n" +
                "FQyZwYVH78//yYzcDyZejVy54/SFeWUwv89Gy155I96ao0pao4CJh16sf/b7H60+idzmmye/o9PK\n" +
                "5JiiOSGEaNyMFFlmg11gTrBqHN/7PAHNc6V22a9GpMeKfO7qEljBEyfzgkxhC6JP1dOOqIS9iBRg\n" +
                "wIymZxYWQaRhVfhniRYQZKQYBr3uZ6zRi/np7C8M8TWK3riHey5y/U868XELzdAmgwFJz3mjcnZJ\n" +
                "Rze6SwIDAQAB";
        String privateKeyStr = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDm33KvZg9r8KbLaBRsi0vGZKmS\n" +
                "LNxMfTNicFnvHefTsc25E8B7bXm1m2h19KjP0bGksqCf0espqfnNA3oRInZTbV69xjRVmNZgwFjR\n" +
                "f2gk1CoVDJnBhUfvz//JjNwPJl6NXLnj9IV5ZTC/z0bLXnkj3pqjSlqjgImHXqx/9vsfrT6J3Oab\n" +
                "J7+j08rkmKI5IYRo3IwUWWaDXWBOsGoc3/s8Ac1zpXbZr0akx4p87uoSWMETJ/OCTGELok/V046o\n" +
                "hL2IFGDAjKZnFhZBpGFV+GeJFhBkpBgGve5nrNGL+ensLwzxNYreuId7LnL9TzrxcQvN0CaDAUnP\n" +
                "eaNydklHN7pLAgMBAAECggEBAJLhCXdpONp1CchSeNvtatHW7MKgY68N4Aj6bVzg68IUVksus8BS\n" +
                "j6HoMvcIJfXA9IFRWzsSM8gX6WJymdAY2qqM5D9bv6PNTmXTOS5fHgSALh2iHJevkWqSK6swQDgr\n" +
                "MvBAU8sgn2Hx7Ke62NE9U1hsoHjOLwfiGJzUsG3g1Tb6rWrKz+fyVBtwQE0GwsWPKpft1XfSuTNg\n" +
                "c8Jh+//wXqyn+k+MgTmdstnHb7zfhPC5CSzmhmuZLl68ry1HaFvPjQpAmcKjVKIgK+qkb2+RYz84\n" +
                "XHl2PInN3rggNmfP6lD8TF8i53BIv3ziksaITk4YK1AfLKb6Wjt7A1gCgoq9A1ECgYEA+KWd1vUo\n" +
                "0OM466CKioJD7/VSOvVR2QAdS3TiWclUVWjL6lOTBhJf0Y8oK9xy3+XNykwKF2YoFpkIikO5dX7l\n" +
                "NZTwJ2J66Ij006ocYlWtyUcBgJCIt7QTGSdxnvDdt25x1UXXbch2PaH7P4OPhdlWkeckJyQ0hycY\n" +
                "m3ktoEm5/dUCgYEA7bNFwv4KpbmXRpTZvpWi6uuDQnYIH6fb5Qozp0WbAZY2RjPpUpGz54loiusz\n" +
                "RRqdP9sr79GIARAuxvJAFRcnmZKcbrEQEFSzO0fFVX0f1HIfMrkce0Cpk8Y2RSkmeYmSvr1vlZ6d\n" +
                "QnuTzBV9HtJvtwQ9LbbBQkjCffQEQeeZR58CgYEAyaaXMaO1rGL64K1cbiRjMJJGVCZscI6VM4Lh\n" +
                "p2uOB45sAegxjnUMXIm7TIcGauqWUQAGFx/0Vw9ZS7jNCasV/LSDZ42InFmmJJsLVfyiamA5qaiO\n" +
                "GF3kNzwz+3Dgf0kE7LAtnI08x5M8jjAGD8lJWh6YxV2pdAqS/FP0WtAwFNkCgYAmEKJoUoRj+6+F\n" +
                "BwtDoPThB+wSNZKhdyEYsaSJ8fSbsXFplqCTr2+O8YtDS9z/AP8TncaQdg6AlRXYmCy48+dMiZTx\n" +
                "iPtYkifNo3WvdgUl4Uyrs8ci2b0ORBymwKs/pU9RqkZ3QFpQrjeB5CMQT4TCWzRs4KpcMgirYOtZ\n" +
                "nnwGYwKBgEmmGl5KHjeDvZx+WkYOV+LXzsvVaBxHFE/LFHD5srcoeSW2dyBK8q+RXwpFQsmh9Q58\n" +
                "ARb/hyWZ70V+XeTRKPPt9B4nYu1s40liZGFAf5Dutd7aDWL7H8FlBYhYa9u1wv4x5YtRKItNvwl6\n" +
                "G8id3M/BPGsJrOJrmhhFyOTiJc/V";
        /**
         * 待加密数据
         */
        String msg = "身先士卒";
        RSAUtil.setPublicKeyStr(publicKeyStr);
        RSAUtil.setPrivateKeyStr(privateKeyStr);
        /**
         * 公钥加密
         */
        String publicEncrypt = RSAUtil.publicEncrypt(msg);
        /**
         * 私钥解密
         */
        String privateDecrypt = RSAUtil.privateDecrypt(publicEncrypt);
    }

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值