前言
由于在银行方面工作对数据安全性要求比较高,需要对前后端通信的数据进行加密,因此编写一个简易的RSA加密算法工具类,可以提高前后端传送数据时的安全性。再次罗列下来,希望自己能有一个更好的理解以及帮助到有需要的小伙伴!有问题的小伙伴可以底部留言,我抽空都会帮忙解答一下,一起加油,共同进步!
一、第一步使用generatorKeyPair产生公私钥
首先创建generatorKeyPair对象(传入要加密的算法)并初始化(传入加密位数),使用其产生keyPair,接着从其其中取出公私钥,最后放到map中进行打包返回。 /**
* 通过KeyPairGenerator产生公私钥
* @return
* @throws NoSuchAlgorithmException
*/
public static Map<String ,Object> generetorKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGenerator.initialize(INITIALIZE_LENGTH);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
HashMap<String, Object> map = new HashMap<>();
map.put("RSAPublicKey",rsaPublicKey);
map.put("RSAPrivateKey",rsaPrivateKey);
return map;
}
二、取出公私钥字符串
手动创建两个方法,分别对公私钥进行base64加密字符串(此处采用 java.util.Base64或者commons.codec下的Base64都是可以的),有效提高公私钥的安全性。
/**
* 拿到RSA公钥字符串
* @param map
* @return
*/
public static String getRSAPublicKey(Map<String ,Object> map) {
Key rsaPublicKey = (Key) map.get(PUBLIC_KEY);
return Base64.getEncoder().encodeToString(rsaPublicKey.getEncoded());
}
/**
*拿到RSA私钥字符串
* @param map
* @return
*/
public static String getRSAPriateKey(Map<String ,Object> map) {
Key rsaPrivateKey = (Key) map.get(PRIVATE_KEY);
return Base64.getEncoder().encodeToString(rsaPrivateKey.getEncoded());
}
三、加解密算法
通过Cipher加解密类实现RSA的加密解密,加密和解密的过程类似,是一个可逆的过程。加密公钥采用的是X509EncodedKeySpec 产生一个实例作为参数传入KeyFactory中产生一个公钥。后面直接把公钥以及数据作为参数传入Cipher中即可实现加密。这里如果需要加密的数据长度较小可以采用一次加密。否则可以采用分段加密,代码中有详细解释,这里不多做阐述。解密的过程类似,但采用PKCS8EncodedKeySpec 产生实例,并把其传入KeyFactory中产生私钥,下面解密与加密类似可以一次性解密就直接解密,否则就分段解密。
/**
* 使用公钥进行加密
* @param data
* @param publicKey
* @return
* @throws Exception
*/
public static byte[] encryptByPublic( byte[] data,String publicKey ) throws Exception {
byte[] decode = Base64.getDecoder().decode(publicKey);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(decode);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicK = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.