业务需要 和别人对接使用RSA算法 琢磨一些日子 记下来 防止 忘记
介绍两种概念
首先 RSA算法 是非对称 加密和解密 ,不明白非对称,那就说一下 对称是啥:A用一种方式加密信息,将信息传给了B,B也利用A的加密方式来解密,这个就是对称。
那么非对称就是,信息的发送者与信息的接受者用不同的方式去加密和解密信息;RSA算法会生成一对密钥(公钥和私钥)。至于是使用公钥或者私钥加密,网上各有说法,说都可以。
不过,个人建议使用公钥加密,私钥解密,因为名字是这样叫的,肯定是有原因的,只是不去详细追究。下面看一图:

1:首先生成一对公钥和私钥 并存放在map

public static Map<String, Object> initKey() throws Exception {
    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
    keyPairGen.initialize(1024);
    KeyPair keyPair = keyPairGen.generateKeyPair();
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
    Map<String, Object> keyMap = new HashMap<String, Object>(2);
    keyMap.put(PUBLIC_KEY, publicKey);
    keyMap.put(PRIVATE_KEY, privateKey);
    return keyMap;
}

2:加密过程 公钥加密

public static String enCode(String para) throws Exception{
    Cipher cipher = Cipher.getInstance("RSA");
    RSAPublicKey pubKey  = (RSAPrivateKey) keyMap.get(PUBLIC_KEY);
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    byte [] inputText = cipher.doFinal(para.getBytes());

    //为了更好的在网络上运输
    String encryptString = encryptBASE64(inputText);
    return encryptString;
}

3:解密过程 私钥解密

public static void convertCode(String code) {
//将编码化的参数  解码
try {
    byte[] inputText = decryptBASE64(code);
    RSAPrivateKey priKey = (RSAPublicKey)keyMap.get(PRIVATE_KEY);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, priKey);
    byte[] yuanwen = cipher.doFinal(inputText);
    System.out.println(new String(yuanwen));
}

两个辅助的方法 干啥用的了 一个是将加密之后的密文利用Base64编码进而让密文在网络上传输,另外一个则是接受方对接受的信息解码,变为密文。

public static byte[] decryptBASE64(String key) throws Exception {
    return (new BASE64Decoder()).decodeBuffer(key);
}

public static String encryptBASE64(byte[] key) throws Exception {
    return (new BASE64Encoder()).encodeBuffer(key);
}

最终代码:

public class Keys {
    private static final String PUBLIC_KEY = "RSAPublicKey";
    private static final String PRIVATE_KEY = "RSAPrivateKey";

    private static Map<String, Object> keyMap = null;

    static {
        try {
            //生成密钥
            keyMap = initKey();
            //将公钥存起来
            publicKeyToFile("c://public_key.prem");
            privateKeyToFile("c://private_key.prem");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }

    /**
     * 加密过程
     * @throws Exception 
     * 
     */
    public static String enCode(String para) throws Exception{
        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);

        RSAPrivateKey priKey  = (RSAPrivateKey) keyMap.get(PRIVATE_KEY);

        cipher.init(Cipher.ENCRYPT_MODE, priKey);

        byte [] inputText = cipher.doFinal(para.getBytes());

        //为了更好的在网络上运输
        String encryptString = encryptBASE64(inputText);
        return encryptString;
    }


    /**
     * 解密过程
     * @param code
     * @throws Exception
     */
    public static void convertCode(String code) {
        //将编码化的参数  解码
        try {   
        byte[] inputText = decryptBASE64(code);

        RSAPublicKey pubKey = (RSAPublicKey)keyMap.get(PUBLIC_KEY);

        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, pubKey);

        byte[] yuanwen = cipher.doFinal(inputText);
        System.out.println(new String(yuanwen));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        //加密过程
        //需要加密的原文
        String parameter = "werwettr|"+Calendar.getInstance().getTimeInMillis();
        System.out.println(parameter);
        String encryptString = enCode(parameter);
        System.out.println(encryptString+"-------------");
        convertCode(encryptString);
    }
}