java中使用RSA加密Demo

RSA加密

加密

/**
 * 使用RSA公钥加密数据
 *
 * @param data      需要加密的字节数组
 * @param publicKey 公钥字符串(Base64编码)
 * @return 加密后的字节数组
 * @throws Exception 加密过程中的异常
 */
public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
    // 解码公钥
    byte[] keyBytes = Base64.getDecoder().decode(publicKey);
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    Key publicK = keyFactory.generatePublic(x509KeySpec);

    // 创建并初始化加密器
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, publicK);

    int inputLen = data.length;
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int offSet = 0;

    // 分段加密(每段最大117字节)
    for (int i = 0; inputLen - offSet > 0; offSet = i * 117) {
        byte[] cache;
        if (inputLen - offSet > 117) {
            cache = cipher.doFinal(data, offSet, 117);
        } else {
            cache = cipher.doFinal(data, offSet, inputLen - offSet);
        }
        out.write(cache, 0, cache.length);
        ++i;
    }

    byte[] encryptedData = out.toByteArray();
    out.close();
    return encryptedData;
}

解密

/**
 * 使用RSA私钥解密数据
 *
 * @param data 需要解密的字符串(Base64编码)
 * @return 解密后的明文字符串
 * @throws Exception 解密过程中的异常
 */
private static String decryptDataOnJava(String data) throws Exception {
    try {
        // Base64解码加密数据
        byte[] encryptedData = Base64.getDecoder().decode(data);
        // Base64解码私钥
        byte[] keyBytes = Base64.getDecoder().decode(私钥);
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);

        // 创建并初始化解密器
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, privateK);

        int inputLen = encryptedData.length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;

        // 分段解密(每段最大128字节)
        for (int i = 0; inputLen - offSet > 0; offSet = i * 128) {
            byte[] cache;
            if (inputLen - offSet > 128) {
                cache = cipher.doFinal(encryptedData, offSet, 128);
            } else {
                cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
            }
            out.write(cache, 0, cache.length);
            ++i;
        }

        byte[] decryptedData = out.toByteArray();
        out.close();
        return new String(decryptedData, "UTF-8");
    } catch (Exception e) {
        throw new Exception("数据解密异常:" + e.getMessage());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

录大大i

如果文章有用,还请鼓励一下作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值