常用的RSA+BASE64 加密解密

@Slf4j
public class RSAUtil {

    private  static  String publicKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ6AEtEdfDt9/2CnHc8JZsnMUBM2rkuNpA0jV++1A8bZgfXliS4HK2hJbeWWH1CW3xMnQQqq57/Nuqdt7swNiSgToSCz9SX+S2Lsj6eRPXH33l+MBjvTRRSJDRx1ydHTS5219YoDVDqJLAD7kjB2d4mM1cHZnhhfa+SXGPPkoscwIDAQAB==";
  private  static  String privateKey="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAInoAS0R18O33/YKcdzwlmycxQEzauS42kDSNX77UDxtmB9eWJLgcraElt5ZYfUJbfEydBCqrnv826p23uzA2JKBOhILP1Jf5LYuyPp5E9cffeX4wGO9NFFIkNHHXJ0dNLnbX1igNUOoksAPuSMHZ3iYzVwdmeGF9r5JcY8+SixzAgMBAAECgYBsq3i5xjSrEqsWG9brzl4KymJndtgF0jCSIdNr86efZpEYLuVHIDzk3IhyQCbzy3FqPmK9e3IxW+jRZAh4seI2KVG+0SuJHe0ecb0v+rHIdJ9WLB03v4z7A1sV8d2GaBZKVYFm8zQJYDyEq9axfy9xfXE1gujGcgek8F4Hx3r2IQJBAOjMdFZUy7gm9UT1SCxCxbgmACJrpB3YLiXKa4DEtPOW1+K/GooZEVXqTgeJwiHJN15W4MBTbSQBivCo3domaOMCQQCXpn+JxIdAtN+g2uuepRUy5e4PEC/7QtfhWwRiDGmYOKQ9x2gJDuJE6FF4zwzf4hMaYH9RzZQmFdz1jsIrH9MxAkBeL5IF96qwZ7ql2qMHnUBHX8CALJKqrHMHQR07bNpVDztq9qxzIO89ll1ZeWe8qZ8oIPgvd9FZVvJyqa+QeifHAkBDMWSlOEztYLcNYLKxkle4O6SlS/jWjaF1moxwnStUZRRwwx/Xk56yBXXD34nG0TbBoywGpN4Vme5TZzOlQ+6hAkA6opW0LgpHjgyIf/VoUVJrdv2XXTtIuVYp2V27mFj5yl81t+keo3IiUYcTvgnQfKpxKsthSf2BMCrStLr0dmKv==";


    /**
     * 加密
     *
     * @param message   需要加密的字符串
     * @param publicKey 公钥
     * @return 加密后的字符串
     */
    public static String encrypt(final String message, final String publicKey) {
        //base64编码的公钥
        try {
            final byte[] decoded = Base64.decodeBase64(publicKey);
            final RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
            //RSA加密
            final Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);

            final byte[] bytes = message.getBytes(StandardCharsets.UTF_8);
            //字符串长度
            final int len = bytes.length;
            int offset = 0;//偏移量
            int i = 0;//所分的段数
            final ByteArrayOutputStream bos = new ByteArrayOutputStream();

            while (len > offset) {
                byte[] cache;
                if (len - offset > 117) {
                    cache = cipher.doFinal(bytes, offset, 117);
                } else {
                    cache = cipher.doFinal(bytes, offset, len - offset);
                }
                bos.write(cache);
                i++;
                offset = 117 * i;
            }
            bos.close();

            final String encryptMessage = Base64.encodeBase64String(bos.toByteArray());
            return encryptMessage.replaceAll("[\r\n]", "");
        } catch (Exception  e) {
            //log.error("使用公钥对数据加密异常", e);
        }
        return null;
    }

    /**
     * 解密
     *
     * @param message    需要解密的密文
     * @param privateKey 私钥
     * @return 解密后的字符串
     */
    public static String decrypt(String message, final String privateKey) {
        try {
            //log.info("message1 = " + message);
            if (message.contains(" ")) {
                //log.info("解码前的字符串包含空格");
                message = message.replaceAll(" ", "+");
            }
            //log.info("message2 = " + message);
            //base64编码的私钥
            final byte[] decoded = Base64.decodeBase64(privateKey);
            RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, priKey);
            //64位解码加密后的字符串
            final byte[] inputByte = Base64.decodeBase64(message.getBytes(StandardCharsets.UTF_8));

            final int len = inputByte.length;//密文
            int offset = 0;//偏移量
            int i = 0;//段数
            final ByteArrayOutputStream bos = new ByteArrayOutputStream();
            while (len - offset > 0) {
                byte[] cache;
                if (len - offset > 128) {
                    cache = cipher.doFinal(inputByte, offset, 128);
                } else {
                    cache = cipher.doFinal(inputByte, offset, len - offset);
                }
                bos.write(cache);
                i++;
                offset = 128 * i;
            }
            bos.close();

            return new String(bos.toByteArray(), StandardCharsets.UTF_8);
        } catch (Exception e) {
            //log.error("使用私钥对数据解密异常", e);
        }
        return null;
    }

    public static void main(String[] args) {
        String content = "1000008";
        String encryptContent = encrypt(content, publicKey);
        System.out.println("加密后的字符串:\n" + encryptContent);

        assert encryptContent != null;
        String decryptContent = decrypt(encryptContent, privateKey);
        System.out.println("解密后的字符串:\n" + decryptContent);
    }
}

生成密钥

/**
 * 随机生成密钥对,返回公钥、私钥
 *
 * @author changzhichen
 * @date 2020-12-16 09:11
 * @return java.util.Map<java.lang.String,java.lang.Object>
 **/
public static Map<String, Object> genKeyPair() {
    try {
        final Map<String, Object> keyMap = new HashMap<>();
        // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        // 初始化密钥对生成器,密钥大小为96-1024位
        keyPairGen.initialize(1024, new SecureRandom());
        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        // 得到私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        // 得到公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
        // 得到私钥字符串
        String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
        // 将公钥和私钥保存到Map
        //0表示公钥
        keyMap.put("publicKey", publicKeyString);
        //1表示私钥
        keyMap.put("privateKey", privateKeyString);
        // log.info("-----publicKey = " + publicKeyString);
        //log.info("-----privateKey = " + privateKeyString);
        System.out.printf("-----publicKey = " + publicKeyString);
        System.out.printf("-----privateKey = " + privateKeyString);
        return keyMap;
    } catch (NoSuchAlgorithmException e) {
        /// log.error("生成RSA密钥对异常", e);
    }
    return null;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值