1.Java对数加密
1.1需要用到的包和类
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;
1.2 生成随机密钥对
keySize可以自己指定,一般512或1024
/**
* 生成密钥对
* @param keySize 密钥长度
* @return
*/
public static void genKeyPair(int keySize) throws Exception{
//1.生成公钥和私钥,基于RSA算法
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//2.初始化密钥对生成器,密钥大小为96-1024位
keyPairGenerator.initialize(keySize, new SecureRandom());
//3.生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//4.获取私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
//5.获取公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
//6.得到公钥字符串
String pubStr = new String(Base64.encodeBase64(publicKey.getEncoded()));
//7.得到私钥字符串
String privStr = new String(Base64.encodeBase64(privateKey.getEncoded()));
//8.放入keyMap中
keyMap.put(0, pubStr);
keyMap.put(1, privStr);
}
1.3对数据RSA加密
公钥加密可指定字符集,一般是UTF-8,返回的加密数据用Base64
/**
* 公钥加密
*
* @param str 待加密的字符串
* @param publicKey 公钥
* @return
*/
public static String encrypt(String str, String publicKey, String charset) throws Exception {
//base64编码的公钥
byte[] decode = Base64.decodeBase64(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode));
Cipher cipher = Cipher.getInstance("RSA");
//RSA加密
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return Base64.encodeBase64String(cipher.doFinal(str.getBytes(charset)));
}
1.4对RSA数据解密
私钥解密可指定字符集,一般是UTF-8
/**
* 私钥解密
*
* @param str 待解密的字符串
* @param privateKey 私钥
* @return
*/
public static String decrypt(String str, String privateKey, String charset) throws Exception {
//1.base64解码字符串
byte[] bytes = Base64.decodeBase64(str.getBytes(charset));
//2.base64编码的私钥
byte[] decode = Base64.decodeBase64(privateKey);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decode));
//3.RSA解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, priKey);
return new String(cipher.doFinal(bytes));
}
1.5测试
结果就不再展示了
public static void main(String[] args) throws Exception{
genKeyPair(512);
System.out.println("public公钥:" + keyMap.get(0));
System.out.println("private私钥:" + keyMap.get(1));
String str = "{1234,12312}";
String msgEn = encrypt(str, keyMap.get(0),"UTF-8");
System.out.println("加密后的字符串为:"+msgEn);
String msgDe = decrypt(msgEn,keyMap.get(1),"UTF-8");
System.out.println("解密后的字符串为:"+msgDe);
}
2.微信小程序端使用
2.1 jsencrypt.js的修改
微信社区:https://developers.weixin.qq.com/community/develop/doc/000068b497cfc00619b7bcfdc51004
百度网盘分享:https://pan.baidu.com/s/1jqkCqNiaLpITmiwhABuz9g
提取码:1234
2.2 小程序引入及使用
//在需要使用的地方引用:
const Encrypt = require('jsencrypt.js')
let crypt = new Encrypt.JSEncrypt():
//加密用:
crypt.setPublicKey("-----BEGIN PUBLIC KEY-----"+util.rsa_public_key+"-----BEGIN PUBLIC KEY-----")
crypt.encrypt("待加密的字符串");
//解密用:
crypt.setPrivateKey("-----BEGIN PRIVATE KEY-----"+util.rsa_public_key+"-----BEGIN PRIVATE KEY-----")
//java后台生成
crypt.decrypt("RSA加密生成BASE64数据");
2.3 RSA算法
参考:https://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
也可参考百度百科