RSA加密和解密

RSA是一种非对称加密算法.RSA有两个密钥,一个是公开的,称为公开密钥;一个是私密的,称为私密密钥。公开密钥是对大众公开的,私密密钥是服务器私有的,两者不能互推得出。用公开密钥对数据进行加密,私密密钥可解密;私密密钥对数据加密,公开密钥可解密。

一、工具类

 1 import java.io.IOException;
 2 import java.security.KeyFactory;
 3 import java.security.KeyPair;
 4 import java.security.KeyPairGenerator;
 5 import java.security.PrivateKey;
 6 import java.security.PublicKey;
 7 import java.security.spec.PKCS8EncodedKeySpec;
 8 import java.security.spec.X509EncodedKeySpec;
 9 
10 import javax.crypto.Cipher;
11 import sun.misc.BASE64Decoder;
12 import sun.misc.BASE64Encoder;
13  
14  
15 public class RSAUtil {
16     
17     
18     //生成秘钥对
19     public static KeyPair getKeyPair() throws Exception {
20         KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
21         keyPairGenerator.initialize(512); //长度可更改  512 1024 2048 4096
22         KeyPair keyPair = keyPairGenerator.generateKeyPair();
23         return keyPair;
24     }
25     
26     //获取公钥(Base64编码)
27     public static String getPublicKey(KeyPair keyPair){
28         PublicKey publicKey = keyPair.getPublic();
29         byte[] bytes = publicKey.getEncoded();
30         return byte2Base64(bytes);
31     }
32     
33     //获取私钥(Base64编码)
34     public static String getPrivateKey(KeyPair keyPair){
35         PrivateKey privateKey = keyPair.getPrivate();
36         byte[] bytes = privateKey.getEncoded();
37         return byte2Base64(bytes);
38     }
39     
40     //将Base64编码后的公钥转换成PublicKey对象
41     public static PublicKey string2PublicKey(String pubStr) throws Exception{
42         byte[] keyBytes = base642Byte(pubStr);
43         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
44         KeyFactory keyFactory = KeyFactory.getInstance("RSA");
45         PublicKey publicKey = keyFactory.generatePublic(keySpec);
46         return publicKey;
47     }
48     
49     //将Base64编码后的私钥转换成PrivateKey对象
50     public static PrivateKey string2PrivateKey(String priStr) throws Exception{
51         byte[] keyBytes = base642Byte(priStr);
52         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
53         KeyFactory keyFactory = KeyFactory.getInstance("RSA");
54         PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
55         return privateKey;
56     }
57     
58     //公钥加密
59     public static byte[] publicEncrypt(byte[] content, PublicKey publicKey) throws Exception{
60         Cipher cipher = Cipher.getInstance("RSA");
61         cipher.init(Cipher.ENCRYPT_MODE, publicKey);
62         byte[] bytes = cipher.doFinal(content);
63         return bytes;
64     }
65     
66     //私钥解密
67     public static byte[] privateDecrypt(byte[] content, PrivateKey privateKey) throws Exception{
68         Cipher cipher = Cipher.getInstance("RSA");
69         cipher.init(Cipher.DECRYPT_MODE, privateKey);
70         byte[] bytes = cipher.doFinal(content);
71         return bytes;
72     }
73     
74     //字节数组转Base64编码
75     public static String byte2Base64(byte[] bytes){
76         BASE64Encoder encoder = new BASE64Encoder();
77         return encoder.encode(bytes);
78     }
79     
80     //Base64编码转字节数组
81     public static byte[] base642Byte(String base64Key) throws IOException{
82         BASE64Decoder decoder = new BASE64Decoder();
83         return decoder.decodeBuffer(base64Key);
84     }
85 }

二、测试类

import static org.junit.Assert.*;

import org.junit.Test;

import com.sino.nms.gpon.serviceImpl.SinoLicenseTimeServiceImpl;
import com.sino.nms.otn.utils.RSAUtil;
import com.sino.nms.struts.gpon.bean.User;

import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
 
 
public class RSA {
 
    @Test
    public void testRSA(){
        try {
            //===============生成公钥和私钥,公钥传给客户端,私钥服务端保留==================
//            生成RSA公钥和私钥,并Base64编码
            KeyPair keyPair = RSAUtil.getKeyPair();
            String publicKeyStr = RSAUtil.getPublicKey(keyPair);
            String privateKeyStr = RSAUtil.getPrivateKey(keyPair);
            System.out.println("RSA公钥Base64编码:" + publicKeyStr);
            System.out.println("RSA私钥Base64编码:" + privateKeyStr);
//            String publicKeyStr = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAK6RG8dNlCP5Jhksr/r3A4Zqm2yPAa+HUDEkXANvos48of7IelwenZBfjXTeZShKrYdyIfAosyU7jkb/4FOmBTMCAwEAAQ==";
//            String privateKeyStr = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEArpEbx02UI/kmGSyv+vcDhmqbbI8B
"
//+"r4dQMSRcA2+izjyh/sh6XB6dkF+NdN5lKEqth3Ih8CizJTuORv/gU6YFMwIDAQABAkAuEf3Sy5ad
"
//+"J9P2MOUAxtAXWWtLazJ2sK9pSL8/6OZ+pvJERzNyygSW7FQrLrRcdYljHw+tn1uJDcfz5B0CozUB
"
//+"AiEA1I5sVwILBIzPBTsJ3/CFdIBQAtfApRlgr5RFChufpYkCIQDSPvYxLR5h0kr6+KmpwmYsHI8E
"
//+"Ja66UzxshvoNxWbh2wIhAMWgnm7PgXr7iMguOmIyeYL2gm4COCXJULIvQ3nAcVExAiBIovwHjWD7
"
//+"xt2ky5hCUClggBVhB2vQb8VmcVOewl6DFQIhAI3MJY/xoPqqBbw2cHSXR+iFOYBdumpRLB4GvOUR
"
//+"isaP";
//            System.out.println("RSA公钥Base64编码:" + publicKeyStr);
//            System.out.println("RSA私钥Base64编码:" + privateKeyStr);
            
            //=================客户端=================
            //public 加密
            String message = "public";
            //将Base64编码后的公钥转换成PublicKey对象
            PublicKey publicKey = RSAUtil.string2PublicKey(publicKeyStr);
            //用公钥加密
            byte[] publicEncrypt = RSAUtil.publicEncrypt(message.getBytes(), publicKey);
            //加密后的内容Base64编码
            String byte2Base64 = RSAUtil.byte2Base64(publicEncrypt);
//            String byte2Base64 = "fcqRB2XPu53meL8dgXFlmv2NBGaZ62JfmExu5KVao4Epr6Q5P0vKOddW6T/cDYtCkKYhQsY06u70XNoUrS34Rg==";
            System.out.println("公钥加密并Base64编码的结果:" + byte2Base64);
            
            
            //##############    网络上传输的内容有Base64编码后的公钥 和 Base64编码后的公钥加密的内容     #################
            
            //===================服务端================
            //将Base64编码后的私钥转换成PrivateKey对象
            PrivateKey privateKey = RSAUtil.string2PrivateKey(privateKeyStr);
            //加密后的内容Base64解码
            byte[] base642Byte = RSAUtil.base642Byte(byte2Base64);
            //用私钥解密
            byte[] privateDecrypt = RSAUtil.privateDecrypt(base642Byte, privateKey);
            //解密后的明文
            System.out.println("解密后的明文: " + new String(privateDecrypt));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
 
}
原文地址:https://www.cnblogs.com/lhq1996/p/13565471.html