• 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();
            }
        }
        
     
    }
  • 相关阅读:
    HTML5 在canvas中绘制复杂形状
    干货!最佳谈薪模板分享
    深度解析大学生“白菜价”现状
    【maven】maven 项目 deploy 报错:Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7
    【maven】Maven插件篇 --- maven项目 mvn install 报错: Failed to execute goal on project 项目名: Could not resolve dependencies for project
    【Maven】maven项目 mvn clean install 或 build,报错:Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
    【IDEA】idea 新创建文件 增加 注释模板
    【IDEA】idea一直不停的scanning files to index 解决方法
    【mysql】extra 中的 FirstMatch()解读
    【linux】linux 中 > 和 >>的区别, > 是代替rm 的安全方式
  • 原文地址:https://www.cnblogs.com/lhq1996/p/13565471.html
Copyright © 2020-2023  润新知