什么是RSA
RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
RSA实现
在我们JAVA中,我们可以使用RSA生成公钥和私钥,公钥可以直接放在H5,APP等前端程序中,即使被拿到,想要用公钥破解出私钥也是极难的。可以先决定密钥长度后生成一套一对一关系的公私钥。公钥提供给前端,私钥放在服务端。 通过RSA公钥加密明文,加密后的密文发到服务端,服务端用RSA私钥解密得出明文。
下面是基于RSA的工具类,结合网上了的例子整理而来:
代码语言:javascript复制public class RsaUtils {
/**
* 密钥长度,长度越长速度越慢
*/
private final static int KEY_SIZE = 1024;
/**
* 封装随机产生的公钥和私钥
*/
private static Map<Integer,String> keyMap = new HashMap();
/**
* 随机生成密钥对
*/
public static Map<Integer,String> genKeyPair() throws NoSuchAlgorithmException{
//基于RSA算法的公钥和私钥生成类
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//初始化密钥生成对
keyPairGen.initialize(KEY_SIZE, new SecureRandom());
//生成一个密钥对保存在keypair当中
KeyPair keyPair = keyPairGen.genKeyPair();
//获取私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
//获取公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
/*得到公钥和私钥字符串*/
String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());
//将公钥和私钥保存到Map
/* 0:公钥; 1:私钥*/
keyMap.put(0,publicKeyString);
keyMap.put(1,privateKeyString);
return keyMap;
}
/**
* RSA公钥加密
*
* @param str 加密字符串
* @param publicKey 公钥
* @return 密文
* @throws Exception 加密过程中的异常信息
* NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException,InvalidKeyException,
* UnsupportedEncodingException, BadPaddingException, IllegalBlockSizeException
*/
public static String encrypt(String str, String publicKey) throws Exception {
byte[] strBytes = str.getBytes("UTF-8");
//base64编码的公钥
byte[] decode = Base64.getDecoder().decode(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode));
//RSA算法加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,pubKey);
String s = Base64.getEncoder().encodeToString(cipher.doFinal(strBytes));
return s;
}
/**
* RSA私钥解密
*
* @param str 加密字符串
* @param privateKey 私钥
* @return 明文
* @throws Exception 解密过程中的异常信息
* BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException,
* NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException
*/
public static String decrypt(String str, String privateKey) throws Exception{
//64位解码加密后的字符串
byte[] inputByte = Base64.getDecoder().decode(str);
//base64加密后的私钥
byte[] decode = Base64.getDecoder().decode(privateKey);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decode));
//RSA解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,priKey);
String s = new String(cipher.doFinal(inputByte));
return s;
}
}
测试加密效果
在main方法里执行以下代码,可以简单看一下效率,1024位的密文效率也还可以,推荐在项目中使用。
代码语言:javascript复制public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
//生成公钥和私钥
Map<Integer,String> rsaKey = RsaUtils.genKeyPair();
//加密字符串
System.out.println("公钥:" rsaKey.get(0));
System.out.println("私钥:" rsaKey.get(1));
System.out.println("生成密钥消耗时间:" (System.currentTimeMillis() - startTime) "ms");
String message = "helloworld";
System.out.println("原文:" message);
startTime = System.currentTimeMillis();
//公钥加密
String encryptMessage = RsaUtils.encrypt(message, rsaKey.get(0));
System.out.println("密文:" encryptMessage);
System.out.println("加密密文消耗时间:" (System.currentTimeMillis() - startTime) "ms");
System.out.println("密文长度:" encryptMessage.length());
startTime = System.currentTimeMillis();
//私钥解密
String decryptMessage = RsaUtils.decrypt(encryptMessage, rsaKey.get(1));
System.out.println("解密原文:" decryptMessage);
System.out.println("解密密文消耗时间:" (System.currentTimeMillis() - startTime) "ms");
}
以上就是针对于RSA的简单使用,欢迎交流补充!