RSAUtil

本文详细介绍了如何生成RSA密钥并实现加密与解密操作,包括密钥生成、转换、加密、解密过程及示例代码。
package com.baoyun.linker.op.admin.controller.finance;


import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;


import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;


import lombok.extern.slf4j.Slf4j;


import org.apache.commons.codec.binary.Hex;


import com.baoyun.linker.op.common.util.StringUtil;


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


@Slf4j
public class RSAUtil {


    public static final String RSA = "RSA";


    /**
     * 生成RSA密钥
     * 
     * @return
     * @throws Exception
     */
    public static RSADTO generateRSA() throws Exception {
        RSADTO rsa = null;


        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA);
            keyPairGenerator.initialize(1024);


            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            rsa = new RSADTO();
            String publicString = keyToString(publicKey);
            String privateString = keyToString(privateKey);
            rsa.setPublicKey(publicString);
            rsa.setPrivateKey(privateString);


        } catch (NoSuchAlgorithmException e) {
            log.error("--generateRSA exception:{} ", e);
            throw new Exception(e.getMessage());
        }


        return rsa;
    }


    /**
     * BASE64 String 转换为 PublicKey
     * 
     * @param publicKeyString
     * @return
     * @throws Exception
     */
    public static PublicKey getPublicKey(String publicKeyString) throws Exception {
        PublicKey publicKey = null;
        BASE64Decoder base64Decoder = new BASE64Decoder();
        try {
            byte[] keyByteArray = base64Decoder.decodeBuffer(publicKeyString);
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyByteArray);
            KeyFactory keyFactory = KeyFactory.getInstance(RSA);
            publicKey = keyFactory.generatePublic(x509KeySpec);
        } catch (IOException e) {
            log.error("--getPublicKey publicKeyString:{} exception:{} ", publicKeyString, e);
            throw new Exception(e.getMessage());
        }


        return publicKey;
    }


    /**
     * BASE64 String 转换为 PrivateKey
     * 
     * @param privateKeyString
     * @return
     * @throws Exception
     */
    public static PrivateKey getPrivateKey(String privateKeyString) throws Exception {
        PrivateKey privateKey = null;
        BASE64Decoder base64Decoder = new BASE64Decoder();


        try {
            byte[] keyByteArray = base64Decoder.decodeBuffer(privateKeyString);
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyByteArray);
            KeyFactory keyFactory = KeyFactory.getInstance(RSA);
            privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        } catch (IOException e) {
            log.error("--getPrivateKey privateKeyString:{} exception:{} ", privateKeyString, e);
            throw new Exception(e.getMessage());
        } catch (NoSuchAlgorithmException e) {
            log.error("--getPrivateKey privateKeyString:{} exception:{} ", privateKeyString, e);
            throw new Exception(e.getMessage());
        } catch (InvalidKeySpecException e) {
            log.error("--getPrivateKey privateKeyString:{} exception:{} ", privateKeyString, e);
            throw new Exception(e.getMessage());
        }


        return privateKey;


    }


    /**
     * RSA 加密返回byte[]
     * 
     * @param content
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static byte[] encodeBytePrivate(byte[] content, PrivateKey privateKey) throws Exception {
        byte[] encodeContent = null;
        try {
            Cipher cipher = Cipher.getInstance(RSA);
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            encodeContent = cipher.doFinal(content);
        } catch (NoSuchAlgorithmException e) {
            log.error("--RSA encode content:{} publicKey:{} exception:{} ", content, privateKey, e);
            throw new Exception(e.getMessage());
        } catch (NoSuchPaddingException e) {
            log.error("--RSA encode content:{} publicKey:{} exception:{} ", content, privateKey, e);
            throw new Exception(e.getMessage());
        } catch (InvalidKeyException e) {
            log.error("--RSA encode content:{} publicKey:{} exception:{} ", content, privateKey, e);
            throw new Exception(e.getMessage());
        } catch (IllegalBlockSizeException e) {
            log.error("--RSA encode content:{} publicKey:{} exception:{} ", content, privateKey, e);
            throw new Exception(e.getMessage());
        } catch (BadPaddingException e) {
            log.error("--RSA encode content:{} publicKey:{} exception:{} ", content, privateKey, e);
            throw new Exception(e.getMessage());
        }
        return encodeContent;
    }


    /**
     * RSA 加密返回 Hex
     * 
     * @param content
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static String encodeStringPrivate(byte[] content, PrivateKey privateKey) throws Exception {
        byte[] encodeContent = encodeBytePrivate(content, privateKey);
        String stringContent = Hex.encodeHexString(encodeContent);
        return stringContent;
    }


    /**
     * 解密返回byte[]
     * 
     * @param content
     * @param publicKey
     * @return
     * @throws Exception
     */
    public static byte[] decodeBytePublic(byte[] content, PublicKey publicKey) throws Exception {
        byte[] decodeContent = null;
        try {
            Cipher cipher = Cipher.getInstance(RSA);
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
            decodeContent = cipher.doFinal(content);
        } catch (NoSuchAlgorithmException e) {
            log.error("--RSA decode content:{} PublicKey:{} exception:{} ", content, publicKey, e);
            throw new Exception(e.getMessage());
        } catch (NoSuchPaddingException e) {
            log.error("--RSA decode content:{} PublicKey:{} exception:{} ", content, publicKey, e);
            throw new Exception(e.getMessage());
        } catch (InvalidKeyException e) {
            log.error("--RSA decode content:{} PublicKey:{} exception:{} ", content, publicKey, e);
            throw new Exception(e.getMessage());
        } catch (IllegalBlockSizeException e) {
            log.error("--RSA decode content:{} PublicKey:{} exception:{} ", content, publicKey, e);
            throw new Exception(e.getMessage());
        } catch (BadPaddingException e) {
            log.error("--RSA decode content:{} PublicKey:{} exception:{} ", content, publicKey, e);
            throw new Exception(e.getMessage());
        }
        return decodeContent;
    }


    /**
     * 解密 Hex字符串
     * 
     * @param content
     * @param publicKey
     * @return
     * @throws Exception
     */
    public static byte[] decodeStringPublic(String content, PublicKey publicKey) throws Exception {
        byte[] decodeContent = null;
        try {
            byte[] sourceByteArray = Hex.decodeHex(content.toCharArray());
            decodeContent = decodeBytePublic(sourceByteArray, publicKey);
        } catch (IOException e) {
            log.error("--decodeString content:{} privateKey:{} exception:{} ", content, publicKey, e);
            throw new Exception(e.getMessage());
        }
        return decodeContent;
    }


    /**
     * 将Key转为String
     * 
     * @param key
     * @return
     */
    private static String keyToString(Key key) {
        byte[] keyByteArray = key.getEncoded();
        BASE64Encoder base64 = new BASE64Encoder();
        String keyString = base64.encode(keyByteArray);
        return keyString;
    }
    
    public static class RSADTO {
        /**
         * 公钥
         */
        private String publicKey;


        /**
         * 私钥
         */
        private String privateKey;


public String getPublicKey() {
return publicKey;
}


public void setPublicKey(String publicKey) {
this.publicKey = publicKey;
}
public String getPrivateKey() {
return privateKey;
}


public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
    }
    
    public static class MD5Util {
        /**
         * MD5加密
         *
         * @param s
         * @return
         */
        public static String MD5(String s) {
            char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
            try {
                byte[] btInput = s.getBytes(StringUtil.CHARSET);
                // 获得MD5摘要算法的 MessageDigest 对象
                MessageDigest mdInst = MessageDigest.getInstance("MD5");
                // 使用指定的字节更新摘要
                mdInst.update(btInput);
                // 获得密文
                byte[] md = mdInst.digest();
                // 把密文转换成十六进制的字符串形式
                int j = md.length;
                char str[] = new char[j * 2];
                int k = 0;
                for (int i = 0; i < j; i++) {
                    byte byte0 = md[i];
                    str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                    str[k++] = hexDigits[byte0 & 0xf];
                }
                return new String(str);
            } catch (Exception e) {
                log.error("--MD5 string:{} exception :{}", s, e);
                return null;
            }
        }
    }


    
    public static void main(String[] args) throws Exception {
    RSADTO dto = generateRSA();
System.out.println("私钥 :" + dto.getPrivateKey());
System.out.println("公钥 :" + dto.getPublicKey());


String paramStr = "a=1&b=2";
String privateKey = dto.getPrivateKey();
String sign = RSAUtil.encodeStringPrivate(MD5Util.MD5(paramStr).getBytes(), RSAUtil.getPrivateKey(privateKey));
System.out.println(sign);
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ygl6150373

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值