java 实现 RSA 加密与解密

Java 实现非对称加密

import javax.crypto.Cipher;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class DecodeString {

    public static final String PRIVATE_KEY = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAqBcj+PiAnJqiMO7k" +
            "JmvL/HWRUL02ejt8sw+c7UmLGmdnKiGSFKpRuNUEVrTT/QY2FDvCWYhm59o3J5ZN" +
            "RT2glQIDAQABAkB3rppPYGj6mGOZYc8SyDgi1ncUPNT4LTj5qck7btzbe9MGBE6Y" +
            "pOje5+ivBYZefka3UGWMgHQHC3ygJe2StVr1AiEA1Tt/hAOVrOx7SEfx6p3ixGed" +
            "cNvKvt7g9qdgLvy2QQ8CIQDJzc6/STN9UMKFsLpKbUtucJED4n0IPMP46gOgFmb8" +
            "GwIgMlY0WQa7m7HLvJl3S2pwMOtA6HaKWxqkQrXqZ80yfRMCIEbsjyIJXxBG5ubH" +
            "kuF/gghBhaXg3uKbQKDl1fpYhT9LAiA3+gHzPlcqZrHTN/1EycNI05gmIBrnAV6i" +
            "yUwHVC6ZKg==";
    public static final String PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKgXI/j4gJyaojDu5CZry/x1kVC9Nno7" +
            "fLMPnO1JixpnZyohkhSqUbjVBFa00/0GNhQ7wlmIZufaNyeWTUU9oJUCAwEAAQ==";

    /**
     * 解密<br>
     * 用私钥解密
     */
    public static String decryptByPrivateKey(String data) throws Exception {
        String base64 = decodeBase64URLSafe(data);
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] base64Decoder = decoder.decode(base64);
        return new String(decryptByPrivateKey(base64Decoder));
    }

    /**
     * 解密<br>
     * 用私钥解密
     */
    public static byte[] decryptByPrivateKey(byte[] data) throws Exception {
        // 对密钥解密
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] keyBytes = decoder.decode(PRIVATE_KEY);
        // 取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 对数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }

    /**
     * 公钥加密
     */
    public static String encryptByPublicKey(String encoderStr) throws Exception {
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] keyBytes = decoder.decode(PUBLIC_KEY);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key key = keyFactory.generatePublic(x509KeySpec);
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] publicKeyEncode = cipher.doFinal(encoderStr.getBytes());
        Base64.Encoder encoder = Base64.getEncoder();
        String encodeStr = encoder.encodeToString(publicKeyEncode);
        return encodeBase64URLSafe(encodeStr);
    }

    /**
     * Base64加密对url安全
     *
     * @param string 明文
     * @return 密文
     */
    public static String encodeBase64URLSafe(String string) {
        return string.replace("+", "-").replace("/", "_").replace("=", ",");
    }

    /**
     * Base64解密对url安全
     *
     * @param string 密文
     * @return 明文
     */
    public static String decodeBase64URLSafe(String string) {
        String base64 = string.replace("-", "+").replace("_", "/").replace(",", "=");
        return base64;
    }
}
posted @ 2022-06-24 15:38  kmswilliam  阅读(887)  评论(0编辑  收藏  举报