今天项目里需要用到一个关于密钥加密解密的功能,然后去百度了,看大佬们怎么说的,好多种方式,md5了,RSA了等等等.......,看了半天,还是感觉RSA比较简单点,我copy了一个代码量多的,拿到本地,打断点慢慢研究,大概调试了20分钟吧,算是吃透了,然后发现代码大量冗余,或许帖子本人也是copy的,我把代码删除了好多,做到了用最少的代码把事情做好,接下来上代码
1.导入依赖:这个必须有的
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
2.先提供密钥生成方法:生成的是个map point是生成密钥的铭文,可以自己设置 String类型
/**
* 随机生成密钥对
* @author LinAndQian
* @throws NoSuchAlgorithmException
* @param point
*/
public static Map<String, String> genKeyPair(String point) throws NoSuchAlgorithmException {
log.info("{}|开始生成公私钥",point);
// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,密钥大小为96-1024位
keyPairGen.initialize(1024, new SecureRandom());
// 生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥
String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
// 得到私钥字符串
String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
// 将公钥和私钥保存到Map
Map<String, String> map = new HashMap<>();
map.put("publicKey", publicKeyString);
map.put("privateKey", privateKeyString);
log.info("{}|生成的公私钥|map:{}",point,map);
return map;
}
3.定义密码,然后给公钥加密
//定义密码
String password = "我是大好人";
//公钥加密
//base64编码的公钥
byte[] publicKeyArrs = Base64.decodeBase64(publicKey);
//加密方式是RSA,所以要转化成RSA类型
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyArrs));
//选择加密方式
Cipher cipher = Cipher.getInstance("RSA");
//初始化密码
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
//正是加密
String publicKeyEn = Base64.encodeBase64String(cipher.doFinal(password.getBytes("UTF-8")));
//输出加密后的公钥
System.out.println("加密后的公钥:"+publicKeyEn);
4.私钥给公钥解密,拿到密码:注意必须是同一对公私钥才行
//私钥破公钥密码
//1.先把加密的公钥转化成 base64编码
byte[] publicKeyEnArrs = Base64.decodeBase64(publicKeyEn.getBytes("UTF-8"));
//2.把未加密的私钥转化成 base64编码
byte[] privateKeyArrs = Base64.decodeBase64(privateKey.getBytes("UTF-8"));
//3.把私钥转化为RSA类型的密钥类
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyArrs));
//4.RSA方式解密
Cipher cipher = Cipher.getInstance("RSA");
//5.初始化密码
cipher.init(Cipher.DECRYPT_MODE, priKey);
//6.解密:拿到密码
String password = new String(cipher.doFinal(publicKeyEnArrs));
//7.输出密码
System.out.println("密码是:"+password); // password = "我是大好人"
上面代码就ok了,是不是简单多了,兄弟们,关注林哥我不迷路