RSA加密算法-非对称加密算法的使用


RSA加密算法

一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用斜体样式加密密钥进行加密、解密密钥进行解密

直接上代码

工具类:

import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.Base64;


public class RSAUtil {


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

    //将Base64编码后的私钥转换成PrivateKey对象
    public static PrivateKey string2PrivateKey(String priStr) throws Exception{
        byte[] keyBytes = base642Byte(priStr);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        return privateKey;
    }
    
    //Base64编码转字节数组
    public static byte[] base642Byte(String base64Key) throws IOException{
        Base64.Decoder decoder = Base64.getDecoder();
        return decoder.decode(base64Key);
    }

    /**
     * 解密方法
     * @param byte2Base64
     * @return
     */
    public static String RsaDecrypt(String byte2Base64,String privateKeyStr){
        byte[] decryptedData=null;
        try {
            //将Base64编码后的私钥转换成PrivateKey对象
            PrivateKey privateKey = RSAUtil.string2PrivateKey(privateKeyStr);
            Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
            cipher.init(2, privateKey);
            byte[] encryptedData = RSAUtil.base642Byte(byte2Base64);
            int inputLen = encryptedData.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;

            for(int i = 0; inputLen - offSet > 0; offSet = i * 256) {
                byte[] cache;
                if(inputLen - offSet > 256) {
                    cache = cipher.doFinal(encryptedData, offSet, 256);
                } else {
                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
                }

                out.write(cache, 0, cache.length);
                ++i;
            }

            decryptedData = out.toByteArray();
            out.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return new String(decryptedData);
    }


    /**
     * 分断加密
     * @param byte2Base642
     * @return
     */
    public static String rsaEncrypt(String byte2Base642,String publicKeyStr) {
        String result = "";
        try {
            // 将Base64编码后的公钥转换成PublicKey对象
            PublicKey publicKey = RSAUtil.string2PublicKey(publicKeyStr);
            // 加密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] inputArray = byte2Base642.getBytes();
            int inputLength = inputArray.length;
            // 最大加密字节数,超出最大字节数需要分组加密
            int MAX_ENCRYPT_BLOCK = 117;
            // 标识
            int offSet = 0;
            byte[] resultBytes = {};
            byte[] cache = {};
            while (inputLength - offSet > 0) {
                if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {
                    cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);
                    offSet += MAX_ENCRYPT_BLOCK;
                } else {
                    cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);
                    offSet = inputLength;
                }
                resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);
                System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);
            }
            Base64.Encoder encoder = Base64.getEncoder();
            result = encoder.encodeToString(resultBytes);
        } catch (Exception e) {
            System.out.println(e.toString());
            System.out.println("rsaEncrypt error:" + e.getMessage());
        }
        return result;
    }

}

测试类:

public class Test {
    public static void main(String[] args) {
        //公钥
        String publicKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg0doe1LOyn+ha+Hl12/EcwoLpXq30dmVcPTuPHqmBPtSJ6bN5jnaKR8JiGJANPhRkW0BYoI1Xj1hmHAtPEO+Hh/370MKpU2+xddMQJEmE79zONdrKCMxGm3oZWTGQylQLAWEf8SY32nz0hmh2SQ68oKSGxc8L2XIV9DaSsAc3EaRYPawHtThyWV28hUtmRQmKQ/wf5q346Urmu11ZjEZZUyO9NbzpKdxJRdScg8cbFJ8kRpHS+qbIYyGJkit9xqjuJ/g3L9WvgW8LFF5WUxz93a98LYnI90ESKx2ZD+64p4oyeEgJ52PLkpb//tbLapIA47PQS9+deh03FmNazS1GwIDAQAB";
        //私钥
        String privateKey="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCDR2h7Us7Kf6Fr4eXXb8RzCgulerfR2ZVw9O48eqYE+1Inps3mOdopHwmIYkA0+FGRbQFigjVePWGYcC08Q74eH/fvQwqlTb7F10xAkSYTv3M412soIzEabehlZMZDKVAsBYR/xJjfafPSGaHZJDrygpIbFzwvZchX0NpKwBzcRpFg9rAe1OHJZXbyFS2ZFCYpD/B/mrfjpSua7XVmMRllTI701vOkp3ElF1JyDxxsUnyRGkdL6pshjIYmSK33GqO4n+Dcv1a+BbwsUXlZTHP3dr3wticj3QRIrHZkP7rinijJ4SAnnY8uSlv/+1stqkgDjs9BL3516HTcWY1rNLUbAgMBAAECggEASd6LhyFQZReuMDNbjn9Arm7PoNzNxJJHidj4mSV2d8UnNFKi91JEVPE2/vwyHtw/obIRnmmgOBgX65vriEaiGvdoHsS9n8iAeXitWoOSRnhrEGf+zwYGYlXH+A3dlfsQNsUgCnkIgGZxIR71OGcvmDgqmH3Zit4d/nPx8S/qzXNDoLBmXfZPul2Abh4aHGXLFlIoWF6BHX6qyCyCVzuGOt/M9XwL8S762cXystRBDhO8d06WhDY9veuAyBpjlowwYGxfIkQekxo4GaSGQsI+urufysxQSRgbIE8wjExQhwb+5bI/Fs6KpzFrrOZ8p8JhtkwUk6Eyt8WtY1sCGYdwkQKBgQDSd2mjc9Sr5rNaKbb/pxGbGc7KIamrMuFutx/e3b1RNUBylCG/bI7fH43IfMuSQcHae5cgsKc3vL4Q0M3LEM6AbibTXI0BGz2V2fF5BAGruodeJhmPscTRRNmZrgSVHwK0qWkAjXg+uuzQGdJg7QPQPSpS6tJvdozGBfxlVuk76QKBgQCfrjs+nryOUmXXlmcT2M+nrj7OSINAaIqlG5Ds31bYMzn93Z9AG/JchXkDgAVRxGasBInrpH9uDjllGWxy+WdA+kKE/Soob1thjwz4ADUeqLpY+nncNdQOG8Aj/SbEW8sBvuYCggLQ+DwWQ8PLSckiB5fberv0CPTH15qP8tn6YwKBgQDJQzX6/5ZdOIVEcGW2Pj6g0mIke2Jz+3kGVgodJnCXCtRxfWR0WMybY+JC2cwWNdm6I7vWn/eYXl5nWDWjvZOrzypDrtqMN0+CUGMRNZqfbQVsLAT/m6C5+hwYUQfCzl/ZAbQOujpFyp0RN9AtrhmadhNWLYZE3topt6mwAxeQmQKBgQCfp/52ixJunvZTC3++uV5PAwqrCJerM5vEn/5UyK41d2q5aPkMiaTXW2D23e7zpZMe1V7tbEk5SiGa80Oa5cGWl2MhQ1v+l/DfZ7+Iy/RQ1lWUF8T2KCABhz+i/D/hvwIImc2ynjmgpUK25ESFIx5m1v7AJUR+KOJOWkWhPikyjwKBgEShIr/u7GnImcLL5Dd2H4HqUHBVBQv7Ceb8j3oar/milgBtmSow+bZj0fuX1Mu7Xjw9cswgI0npC7Wd1w79wcWVWDeZF+eg2aqME0Uovd3U2HYhZHSTc2r2U59uLkqsl3jm9xI5+dkQi6FX1v067P8TA6R6ZCc6YSNtkb+z/6nP";
        String string="{\"returnId\":\"9\",\"isRelief\":\"成功\"}";
        System.out.println("加密内容 : "+string);
        String encryptRes = RSAUtil.rsaEncrypt(string,publicKey);
        System.out.println("res加密后的密文 : "+encryptRes);
        String decryptRes = RSAUtil.RsaDecrypt(encryptRes,privateKey);
        System.out.println("res加密密文解密后的内容 : "+decryptRes);
    }
}

测试结果:

加密内容 : {"returnId":"9","isRelief":"成功"}
res加密内容后的密文 : Tur0jUO5zQRFb+S7CFX7qN6oyLQG1IrIEIAAS6yHAlOmkP1/s9CfN09h32wQ7qy/oASiIU+4MtcW2to3ZuwBj1/qeSwg7ceQ9IK5nU4+GT8KpdaqZunEhTKz/U7JSIQRSZFpw7GB8V9JVYM+rrx/dBU+3lzGNPwvlJVhGS16Q8TQlaTZdn/B92S1oZ/cJ1RbAccEhbYBb2mDc+ByCwpYHG8tKHSyCvPILVHDq1hmtg6BuMOhCAZSSXBsC39QjnDwWt9yQ6nY+dL5aQlVwyMkZpCTpSfF9pkIYbH5UiQiZ7hUjrvisxkre7SsAjFyPl1ZnryLCSDZO2DwrZ46mj/0rg==
res加密密文解密后的内容 : {"returnId":"9","isRelief":"成功"}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值