RSA分段加密解密,我搞了1天半了,终于搞好了,记录一下

//公钥
    public static final String PUBLIC_KEY_VALUES = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHe2LfbDCwBnI5dLc6DA40CNLO3F/HRR183knhBX49SemIFnEW9BFUNY7i1qixMQg2CX12TBXG1nt+9OK6IdNcD5USowiKa+mQzK/I9Mu5f88LOpd1CZb2UVQd7sAA3t+ZLsQS0TvTeEFumI6Dci2AhAb2V3R2R1XdWstUzZbAmQIDAQAB";
    //私钥
    public static final String PRIVATE_KEY_VALUES = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAId7Yt9sMLAGcjl0tzoMDjQI0s7cX8dFHXzeSeEFfj1J6YgWcRb0EVQ1juLWqLExCDYJfXZMFcbWe3704roh01wPlRKjCIpr6ZDMr8j0y7l/zws6l3UJlvZRVB3uwADe35kuxBLRO9N4QW6YjoNyLYCEBvZXdHZHVd1ay1TNlsCZAgMBAAECgYA7/4FuzjvViFVHao/GDhawJoQtBd0Io2wGo252T3dzbusT0FRuxNFzyHAptsRoC/3F6Hf+Tn2KW+u+8nYB1f8CbWiK/ad9BfxwwN/RsHAuiW1Gulr1gv6pEQ+KIrDDwgypoiTlz/2jwXOV2Ux3iWnkeoU9z+vRypqL22ZyBX3dHQJBAMvWZTaFhmy+jw8Uq9gJpigI/zWAf9almoOxJF6JQ+rtUW87+yi21hlqNSJV63HLcyPG52c3mRIEXdm+1/1sEnMCQQCqJvNworX5dPzFmeQ54EKE0nBCpHxAYAMq6LVuWjprK627yXiUdR1qNRuxfh59dspYPBqSRDSSjs5RCR+JNMHDAkEAsLG2pt50OkutYxs+I1Wp7MZvxAcRyhVfrYyexDwk3b6+erf57b8gNIO2b38fS1NbCcZfzT+Ktu2GFTyzqoBGNQJBAIZENEeGbfiKQ0iedkThXTw4XtOHvnCCEx3SAhExa/XTwsVzZw4nGG4NuGuoLOEuUt+rlgAjiCS6Qb4aZ+M6WUcCQAKyJa1mmLiHhRlnDlpfFBiXGS+Sp6y+ztBkLivr88wtN4PU0jjxGKOnP2hdyTD/agWQ6ObG1gIoMvk/8RQBy7Y=";

    //一次解密的长度
    private static final int MAX_DECRYPT_BLOCK = 128;
    //一次加密的长度
    private static final int MAX_ENCRYPT_BLOCK = 117;

 /**
     * 解密
     *
     * @param byte_bwmw 报文密文
     */
    public static String decrypt(byte[] byte_bwmw) {
        try {
            //根据给定的编码密钥创建一个新的 PKCS8EncodedKeySpec。
            PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.decode(PRIVATE_KEY_VALUES.getBytes()));
            //返回转换指定RSA算法的  KeyFactory 对象。
            KeyFactory kf = KeyFactory.getInstance("RSA");
            //得到私钥对象
            PrivateKey privateKey = kf.generatePrivate(spec);
            获取一个加密算法为RSA的加解密器对象cipher。
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            //传递私钥,设置为解密模式。
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            //得到报文密文的长度
            int inputLen = byte_bwmw.length;

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;
            byte[] cache;
            int i = 0;
            // 对数据分段解密
            while (inputLen - offSet > 0) {
                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
                    cache = cipher.doFinal(byte_bwmw, offSet, MAX_DECRYPT_BLOCK);
                } else {
                    cache = cipher.doFinal(byte_bwmw, offSet, inputLen - offSet);
                }
                out.write(cache, 0, cache.length);
                i++;
                offSet = i * MAX_DECRYPT_BLOCK;
            }
            //解密后的数据
            byte[] data = out.toByteArray();
            out.close();
            return new String(data);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("解密异常......");
            return null;
        }
    }

    /**
     * 加密
     *
     * @param mingwen 明文
     * @return
     */
    public static byte[] encrypt(String mingwen) {

        byte[] encryptedDatas = new byte[0];
        try {
            //根据给定的编码密钥创建一个新的 X509EncodedKeySpec
            X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decode(PUBLIC_KEY_VALUES));
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(spec);

            //得到Cipher对象来实现对源数据的RSA加密
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);

            byte[] encryptedData = mingwen.getBytes();
            int inputLen = encryptedData.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;
            byte[] cache;
            int i = 0;
            // 对数据分段加密  doFinal
            while (inputLen - offSet > 0) {
                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
                    cache = cipher.doFinal(encryptedData, offSet, MAX_ENCRYPT_BLOCK);
                } else {
                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
                }
                out.write(cache, 0, cache.length);
                i++;
                offSet = i * MAX_ENCRYPT_BLOCK;
            }
            encryptedDatas = out.toByteArray();
            //获取到报文的长度
            int length = encryptedDatas.length;
            System.out.println("报文长度是:" + length);

            out.close();
        } catch (Exception e) {
            System.out.println("加密异常...");
            e.printStackTrace();
        }
        return encryptedDatas;
    }

自己建一个类,把代码贴进去就好了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值