Java非对称加密(RSA)工具类

废话不对说直接上代码:

package cn.com;

import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import java.io.*;
import java.security.*;

/**
 * 非对称加密解密测试类
 */
public class TestRSUtils {
    //公钥字符串
    private static final String PUBLICKEY = "rO0ABXNyAD5vcmcuYm91bmN5Y2FzdGxlLmpjYWpjZS5wcm92aWRlci5hc3ltbWV0cmljLnJzYS5CQ1JTQVB1YmxpY0tleSUiag5b+myEAwACTAAHbW9kdWx1c3QAFkxqYXZhL21hdGgvQmlnSW50ZWdlcjtMAA5wdWJsaWNFeHBvbmVudHEAfgABeHBzcgAUamF2YS5tYXRoLkJpZ0ludGVnZXKM/J8fqTv7HQMABkkACGJpdENvdW50SQAJYml0TGVuZ3RoSQATZmlyc3ROb256ZXJvQnl0ZU51bUkADGxvd2VzdFNldEJpdEkABnNpZ251bVsACW1hZ25pdHVkZXQAAltCeHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhw///+/gAAAAF1cgACW0Ks8xf4BghU4AIAAHhwAAAAgMFkRw8WShs0o9DqpTR6Mj3wbD3M1wW23K19pnbOW5uk5sK0y/on3tLoPyBcl7vjB0KMcP8Pgp9w7rvXC48aZ15ddU88w8ext86NksQL08yMiAJRHBN8+biz/f54pDD6j/y0JihxGv2N/X4MRW0btbv8rQK0AUbILhsVn3J5V4O7eHNxAH4AAv4AAAABdXEAfgAHAAAAAwEAAXh4";
    //私钥字符串
    private static final String PRIVATEKEY = "rO0ABXNyAEJvcmcuYm91bmN5Y2FzdGxlLmpjYWpjZS5wcm92aWRlci5hc3ltbWV0cmljLnJzYS5CQ1JTQVByaXZhdGVDcnRLZXlsuofOAnNVLgIABkwADmNydENvZWZmaWNpZW50dAAWTGphdmEvbWF0aC9CaWdJbnRlZ2VyO0wADnByaW1lRXhwb25lbnRQcQB+AAFMAA5wcmltZUV4cG9uZW50UXEAfgABTAAGcHJpbWVQcQB+AAFMAAZwcmltZVFxAH4AAUwADnB1YmxpY0V4cG9uZW50cQB+AAF4cgA/b3JnLmJvdW5jeWNhc3RsZS5qY2FqY2UucHJvdmlkZXIuYXN5bW1ldHJpYy5yc2EuQkNSU0FQcml2YXRlS2V5RusJwAfPQRwDAAJMAAdtb2R1bHVzcQB+AAFMAA9wcml2YXRlRXhwb25lbnRxAH4AAXhwc3IAFGphdmEubWF0aC5CaWdJbnRlZ2VyjPyfH6k7+x0DAAZJAAhiaXRDb3VudEkACWJpdExlbmd0aEkAE2ZpcnN0Tm9uemVyb0J5dGVOdW1JAAxsb3dlc3RTZXRCaXRJAAZzaWdudW1bAAltYWduaXR1ZGV0AAJbQnhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cP///v4AAAABdXIAAltCrPMX+AYIVOACAAB4cAAAAIDBZEcPFkobNKPQ6qU0ejI98Gw9zNcFttytfaZ2zlubpObCtMv6J97S6D8gXJe74wdCjHD/D4KfcO671wuPGmdeXXVPPMPHsbfOjZLEC9PMjIgCURwTfPm4s/3+eKQw+o/8tCYocRr9jf1+DEVtG7W7/K0CtAFGyC4bFZ9yeVeDu3hzcQB+AAT///7+AAAAAXVxAH4ACAAAAIBSBiqfawhGbra2cvdcASITJEh8k8d1XIBPs1Xp2Q+AvdnEJnPHZ6a6FJhFrRAMODgJkVCR1e3Em10eXZDBAuVpIuHM3y9Yr9ayeJyI6NTlTEc/mYPvoVU6voW6TNVD6d5TK2qBlUGSCgGloUqBm23N2r1QXRAgGeCrTHSz5r60UXh4c3EAfgAE///+/gAAAAF1cQB+AAgAAABAnrfAAPFKf00GVrq5pz0teMH0DUFrtUsqnzmjm0zvw2+kE/H0ZO09IOHiVFyP3djKnrj7OplpDENzXSWbT7W6UHhzcQB+AAT///7+AAAAAXVxAH4ACAAAAEAkIJyQRh+GKTx88JQ7BIB1yUJl4VvSSAACC9D5E/p9N1EUQgA6ElotJefSf/13B1zy8oe+4aQzTUTvCMstF90BeHNxAH4ABP///v4AAAABdXEAfgAIAAAAQEVW2R4EgYMhjKaEAPIFnvhQ0u1+4sZ6CqsPXgZtrIakQxTwUMuwL/EFa/yI/nq0iIxjVehHC+UEvuvS8ZIGlI14c3EAfgAE///+/gAAAAF1cQB+AAgAAABA8WcrdJXrcJFmekkdHkvjc+8XXToX5jUY5tV7Uzw66lS7ZSTeEgZgCgZk3Yql+keEPIqCwFlzZERJZ4KQO2GRkXhzcQB+AAT///7+AAAAAXVxAH4ACAAAAEDNFekWjECx3XnXwWutidfotLuD5C681olcAvhfVciMIOyI7H6r4SvY9x2TgHxDyKx6yb+qj+k3q+/U81Sa6NqLeHNxAH4ABP///v4AAAABdXEAfgAIAAAAAwEAAXg=";

    /**
     * 初始化公钥私钥对
     * keyPair.getPrivate() 为私钥对象
     * keyPair.getPublic() 为公钥对象
     * @return
     */
    public static KeyPair initKey() {
        try {
            Provider provider =new org.bouncycastle.jce.provider.BouncyCastleProvider();
            Security.addProvider(provider);
            SecureRandom random = new SecureRandom();
            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", provider);
            generator.initialize(1024,random);
            return generator.generateKeyPair();
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 公钥加密(使用公钥对象)
     * @param content
     * @param publicKey
     * @return
     */
    public static String encrypt(String content, PublicKey publicKey) {
        try{
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPWITHSHA256AndMGF1Padding","BC");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] output = cipher.doFinal(content.getBytes());
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(output);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 私钥解密(使用私钥对象)
     * @param content
     * @param privateKey
     * @return
     */
    public static String decrypt(String content, PrivateKey privateKey) {
        try {
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPWITHSHA256AndMGF1Padding","BC");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] decodeBuffer = decoder.decodeBuffer(content);
            byte [] b = cipher.doFinal(decodeBuffer);
            return new String(b,"utf-8");
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 使用私钥钥字符串解密
     * @param content
     * @param privateKeyStr
     * @return
     */
    public static String decryptByPrivateKeyStr(String content, String  privateKeyStr) throws IOException, ClassNotFoundException {
        ByteArrayInputStream inputStream1=new ByteArrayInputStream(Base64.decodeBase64(privateKeyStr.getBytes()));
        ObjectInputStream oInputStream1=new ObjectInputStream(inputStream1);
        PrivateKey privateKey1 = (PrivateKey) oInputStream1.readObject();
        oInputStream1.close();
        inputStream1.close();
        return decrypt(content,privateKey1);
    }

    /**
     * 使用公钥字符串加密
     * @param content
     * @param publicKeyStr
     * @return
     */
    public static String encryptByPublicKeyStr(String content, String  publicKeyStr) throws IOException, ClassNotFoundException {
        ByteArrayInputStream inputStream1=new ByteArrayInputStream(Base64.decodeBase64(publicKeyStr.getBytes()));
        ObjectInputStream oInputStream1=new ObjectInputStream(inputStream1);
        PublicKey publicKey = (PublicKey) oInputStream1.readObject();
        oInputStream1.close();
        inputStream1.close();
        return encrypt(content,publicKey);
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1、加密
        String content  =  "123xxxx";
        String secretStr  = encryptByPublicKeyStr(content,PUBLICKEY);
        System.out.println("密文:"+secretStr);
        //2、解密
        String contentStr = decryptByPrivateKeyStr(secretStr, PRIVATEKEY);
        System.out.println("解密后:"+contentStr);
    }
}

你可能感兴趣的:(java,java,rsa,加密解密)