java rsa加解密

发布时间 2023-12-18 16:53:37作者: 飞离地平线

坑点:

  用其他语言的一定注意,Java秘钥和php秘钥不同,不用混用。

 

 

package cn.muyan.monitoragent.utils.encrypt;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

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

/***
 * RSA加解密操作
 */
public class RSAUtils {
    
    // 加密算法
    private static String ALGORITHM = "RSA";
    // 加签算法
    private static String SIGN_ALGORITHM = "MD5withRSA";
    private static String CHARSET = "utf8";


    /***
     * 生成秘钥对
     * @return
     * @throws Exception
     */
    public static KeyPair getKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        return keyPair;
    }

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

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

    /***
     * 将Base64编码后的公钥转换成PublicKey对象
     * @param pubStr
     * @return
     * @throws Exception
     */
    public static PublicKey string2PublicKey(String pubStr) throws Exception {
        byte[] keyBytes = base642Byte(pubStr);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }

    /***
     * 将Base64编码后的私钥转换成PrivateKey对象
     *
     * @param priStr
     * @return
     * @throws Exception
     */
    public static PrivateKey string2PrivateKey(String priStr) throws Exception {
        byte[] keyBytes = base642Byte(priStr);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        return privateKey;
    }

    /***
     * 公钥加密
     * @param base64Key
     * @param publicKey
     * @return
     * @throws Exception
     */
    public static String publicEncrypt(String base64Key, PublicKey publicKey) throws Exception {
        byte[] content = base64Key.getBytes();
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] bytes = cipher.doFinal(content);
        return byte2Base64(bytes);
    }

    /***
     * 公钥解密
     * @param base64Key
     * @param publicKey
     * @return
     * @throws Exception
     */
    public static String publicDecrypt(String base64Key, PublicKey publicKey) throws Exception {
        byte[] content = base642Byte(base64Key);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        byte[] bytes = cipher.doFinal(content);
        return new String(bytes, CHARSET);
    }

    /***
     * 私钥解密
     * @param base64Key
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static String privateDecrypt(String base64Key, PrivateKey privateKey) throws Exception {
        byte[] content = base642Byte(base64Key);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] bytes = cipher.doFinal(content);
        return new String(bytes, CHARSET);
    }

    /***
     * 私钥加密
     * @param base64Key
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static String privateEncrypt(String base64Key, PrivateKey privateKey) throws Exception {
        byte[] content = base64Key.getBytes();
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        byte[] bytes = cipher.doFinal(content);
        return byte2Base64(bytes);
    }

    /**
     * 私钥签名
     *
     * @param data       待签名数据
     * @param privateKey 私钥
     * @return 签名
     */
    public static String sign(String data, PrivateKey privateKey) throws Exception {
        byte[] keyBytes = privateKey.getEncoded();
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        PrivateKey key = keyFactory.generatePrivate(keySpec);
        Signature signature = Signature.getInstance(SIGN_ALGORITHM);
        signature.initSign(key);
        signature.update(data.getBytes());
        return byte2Base64(signature.sign());
    }

    /**
     * 公钥验签
     *
     * @param srcData   原始字符串
     * @param publicKey 公钥
     * @param sign      签名
     * @return 是否验签通过
     */
    public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {
        byte[] keyBytes = publicKey.getEncoded();
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        PublicKey key = keyFactory.generatePublic(keySpec);
        Signature signature = Signature.getInstance(SIGN_ALGORITHM);
        signature.initVerify(key);
        signature.update(srcData.getBytes());
        return signature.verify(base642Byte(sign));
    }

    /***
     * 字节数组转Base64编码
     *
     * @param bytes
     * @return
     */
    public static String byte2Base64(byte[] bytes) {
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(bytes);
    }

    /***
     * Base64编码转字节数组
     * @param base64Key
     * @return
     * @throws IOException
     */
    public static byte[] base642Byte(String base64Key) throws IOException {
        BASE64Decoder decoder = new BASE64Decoder();
        return decoder.decodeBuffer(base64Key);
    }

    public static void main(String[] args) {
        String publicKeyStr = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkm6NbElYw8dJTjK9e7i+urYfBa5mj5PGkMvlfS3nrGROVfA4kenfVGbrKrTmbJBOaCHwrzpHWC16g4dRUKTyGwPMEGZp1wRfqbCXLQcy7Q8H1YlpC0eUxlg7a9GCMIAPDYil+ANmpcueGi0dHmd/4jNMPpVrjA/T/8vnb+QIeXf2GkWp/5F1zD6D6kstNJIpz9wfLenWHV29eMHO+FZa4fYSPWB04snjRdTeG3QDlfFNfoVL0ZNb6n4+K4uWUNu4u4MwNepXvi2MgSUtNuaSIsfiMgNc26qzcwAD/P5NquMFtDJnS3b9AeX49XAsrLvUScitVXpS7/1Mj0bM/vHeIQIDAQAB";
        String privateKeyStr = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCSbo1sSVjDx0lOMr17uL66th8FrmaPk8aQy+V9LeesZE5V8DiR6d9UZusqtOZskE5oIfCvOkdYLXqDh1FQpPIbA8wQZmnXBF+psJctBzLtDwfViWkLR5TGWDtr0YIwgA8NiKX4A2aly54aLR0eZ3/iM0w+lWuMD9P/y+dv5Ah5d/YaRan/kXXMPoPqSy00kinP3B8t6dYdXb14wc74Vlrh9hI9YHTiyeNF1N4bdAOV8U1+hUvRk1vqfj4ri5ZQ27i7gzA16le+LYyBJS025pIix+IyA1zbqrNzAAP8/k2q4wW0MmdLdv0B5fj1cCysu9RJyK1VelLv/UyPRsz+8d4hAgMBAAECggEAJs0woF8XLFmkbRo4543ezG7x7Xl3J9iKp1fAKdl+KEo0D8Wl19RXH3BeJGTnIiFjBWjo9CXHPfBfJHc47tumY84vxrC8nwNDrh1jEcV0kyiGdOkCcsC3BY/fvwQ3MU7drkJlaEDOdGRuMpV9v87BLllVfMfvRZ/0FzYaz6VnMXhWsCErsBfbKfmcZbZq4GWBqG2slmSkvERLM5ZJucqUpebjmQ3dD7AOmrKqjIUkbnb6wgPvWRaTR+C6MBcL7Ysc/amr8tMCjxaDaRY5LTr719ErnZJRDrqckwEkY2zfWj8KKQiVZh5S2W5Uh33K9eCcHFRddWvgaRNgK5YPG7ZPuQKBgQDdXzHQhFbtHCqx3hZ0NAiASNWBoncTLOT6RXn/F829y3Zvd6dTNFdRoc5k9CqstnRH0By471MgYxiRJb9uqod4wmbmKWMZr7QpCnZkuzr+ccLsslyZFzkJQiYw+RmTiyuLfOGUpWnWLDNjiaiiD8D7XM6zQDO09vgAmXip46eCUwKBgQCpVmVBJ3Hp7MVzEFJQl1ZNXWfk3OQx7dUj5+4EahipHBtuSyuzTdhW7dx4ooAEHsv9JWQpJJ439GzANDcAKdZC+AoTFePE0kilXSBgebjUEgDPbN8vipp6uqDuZX4lAyvmPYaQVMz0AoYQqYMLyFsFUCZhmcgjT1H+K4yWH203OwKBgQDSNG2h+bhtKJzmDuQ1bZ9Q6VhL45C8VZoMiGKCtwC3o3cP+4eYe5AaxNGujSfkntAlzNkpRqAhldejJDv2Atnm8noxPcWLg4tImVW46wzmxfF5Pxisih+vye9n+3Gs567uoiO2OagZJhmaAAJv+ROf3A2uql0vDoCKWTD56WGLXwKBgFmMX5VZ56qd1Dip++20aiYVbBiiG2av79PCFaNt+8aKH5Nu2xhB5VLrDHka7fm/0332JQaA386VSmFF+4Pxm+XkR2eaXs25qkMQgUujcvNq5dTLLSd184VNZkdLkq6+A5wJEz0GKzAqmXz8N1mmxUOFBBb+/NB3ZNO1ce39hoL7AoGAevZ5deD/yz/dguxd5tB58MUorFwqM/VLmxQAggXRvR8UusSNdrsa8Zjwzn/WyXJ7wWJ3rFdar6Ml3QMS6d31fxOd3QD01cssYFqL7HqsOcityfuIgsJZl7t7GvUt1YHpn3SuEkbDHvtoWlYwMhtnBeVQmy+RX261c8Rvbu6zXa4=";
        String byte2Base64 = "ggam2MkjuDZ75jOWGuD+WV5EA+VYVk5kFtlAUxfze2kZ0OlNEaK2c9CgovfTKyhRhKCGQRcFNY+ihvIfHP9wUjOvnM3jqDteIs8Thz1S3aTPGQT8zji8Ze2CObELPuZ9xPnbo+wL9cTIMkA4t9d7xMLfMnmV6irIXVOQ5anYCC+U8NLQtEsshqnzzyOMuRojqG+MBWEpe0X9LqFSIzdxVegtwZh9eJ1Zmw9VkvotBs1YnQqF/ivRiX2y6ZB8L7nZwCcS65GQq4ZARcVr5I3PN36p9dznjQguFKGxd3pftmupqoB7w51KzzYpZNfOzGYHM/sHDagUjYQWZL1fsBMnIg==";

        try {
//            KeyPair keyPair = getKeyPair();
//            String publicKeyStr = getPublicKey(keyPair);
//            String privateKeyStr = getPrivateKey(keyPair);
//            System.out.println("RSA公钥Base64编码:" + publicKeyStr);
//            System.out.println("RSA私钥Base64编码:" + privateKeyStr);
            String message = "123456";
//////            //将Base64编码后的公钥转换成PublicKey对象
            PublicKey publicKey = string2PublicKey(publicKeyStr);
            //用公钥加密
            String publicEncrypt = publicEncrypt(message, publicKey);
            //加密后的内容Base64编码
            //byte2Base64 = byte2Base64(publicEncrypt);
            System.out.println("公钥加密并Base64编码的结果:" + publicEncrypt);
            //将Base64编码后的私钥转换成PrivateKey对象
            PrivateKey privateKey = string2PrivateKey(privateKeyStr);

            //加密后的内容Base64解码
//            byte[] base642Byte = base642Byte(byte2Base64);


            //用私钥解密
            String privateDecrypt = privateDecrypt(publicEncrypt, privateKey);
            //解密后的明文
            System.out.println("解密后的明文: " + privateDecrypt);
            // 签名
//            String signStr = sign("11111111", privateKey);
//            System.out.println("签名: " + signStr);

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e);
        }

    }
}