RSA加密解密
RSA是一种非对称加密算法。现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密。
以下为Java程序:
使用RSA一般需要产生公钥和私钥,当采用公钥加密时,使用私钥解密;采用私钥加密时,使用公钥解密。
package com.czxy.rsa;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
/**
* @author mayingwen@itcast.cn
* @date 2020/8/14
* @Version 1.0
*/
public class RSAEncrypt {
//定义用于封装随机产生的公钥和私钥
private static Map<Integer, String> keyMap = new HashMap<Integer, String>();
public static void main(String[] args) throws Exception {
//1.生成公钥和私钥
genKeyPair();
//2.加密字符串
String str = "myw1206";
System.out.println("随机生成公钥为:" + keyMap.get(0));
System.out.println("随机生成私钥为:" + keyMap.get(1));
String strEn = encrypt(str, keyMap.get(0));
System.out.println("加密后的字符串:" + strEn);
String strDe = decrypt(strEn, keyMap.get(1));
System.out.println("解密后的字符串:" + strDe);
}
/**
* RSA私钥解密
*
* @param strEn
* @param privateKey
* @return
*/
private static String decrypt(String strEn, String privateKey) throws Exception {
//1.使用base64为解码加密后的字符串
byte[] bytes = Base64.decodeBase64(strEn.getBytes("UTF-8"));
//2.使用base64编码私钥
byte[] decoded = Base64.decodeBase64(privateKey);
PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
//3.使用RSA解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, priKey);
String outStr = new String(cipher.doFinal(bytes));
return outStr;
}
/**
* RSA公钥加密
*
* @param str
* @param publicKey
* @return
*/
private static String encrypt(String str, String publicKey) throws Exception {
//1.生成base64编码的公钥
byte[] decoded = Base64.decodeBase64(publicKey);
PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
//2.使用RAS加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
return outStr;
}
/**
* 随机生成公钥和私钥
*/
private static void genKeyPair() throws NoSuchAlgorithmException {
//1.基于RSA算法生成对象
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//2.初始化密钥生成器
keyPairGenerator.initialize(1024, new SecureRandom());
//3.生成一个密钥对,保存到keyPair中
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//4.得到私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
//5.得到公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
//6.得到公钥字符串
String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
//7.得到私钥字符串
String privateKeyString = new String(Base64.encodeBase64(privateKey.getEncoded()));
//8.将公钥和私钥保存到Map中
keyMap.put(0, publicKeyString);
keyMap.put(1, privateKeyString);
}
}