业务需要 和别人对接使用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);
}
}