Java非對稱加密(RSA)工具類
阿新 • • 發佈:2021-01-21
廢話不對說直接上程式碼:
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);
}
}