RSA和MD5加密(Java和JavaScript)
生成公钥私钥
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class Wan {
public static Map<String,String> generateKeyPair() throws Exception{
int KEYSIZE = 1024;
// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,密钥大小为96-1024位
keyPairGen.initialize(KEYSIZE,new SecureRandom());
// 生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
// 得到私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 得到公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
Base64.Encoder encoder = Base64.getEncoder();
// 得到公钥字符串
String publicKeyBase64 = encoder.encodeToString(publicKey.getEncoded());
// 得到私钥字符串
String privateKeyBase64 = encoder.encodeToString(privateKey.getEncoded());
Map<String,String> keyPairMap = new HashMap<>();
keyPairMap.put("publicKey",publicKeyBase64);
keyPairMap.put("privateKey",privateKeyBase64);
return keyPairMap;
}
public static void main(String[] args) throws Exception {
System.out.println(generateKeyPair());
}
}
RSA
Java
加密
package com.da;
import com.alibaba.fastjson.JSON;
import org.springframework.util.Assert;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class Wan {
// MAX_DECRYPT_BLOCK 应等于密钥长度/8(1byte=8bit),所以当密钥位数为2048时,最大解密长度应为256.
// 128 对应 1024,256对应2048
private static final int KEYSIZE = 1024;
// RSA最大加密明文大小
private static final int MAX_ENCRYPT_BLOCK = 117;
// RSA最大解密密文大小
private static final int MAX_DECRYPT_BLOCK = KEYSIZE / 8;
public static void main(String[] args) {
// 公钥
String rsaPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDuZddJUu2pz2EPfMwBckbdJD5AGtgR75JbT6JU0PvOm0y/vS8fW/Rbnnlkknir7M8R+lkXchgcREfuRQ0U1iW1JZYG0BTqezR2PHJfWAoScp6az1aA+Toa1k/Y8Gyhs4JKDB8+hjeMFTtW0FIR8u+eByQ9nTrcZ0oZ6Hr1AX7G/QIDAQAB";
// 需要加密的内容1
Map<String,String> MData1 = new HashMap<>();
MData1.put("今天是啥日子","20230501");
MData1.put("nijiazhunali","真在地球上");
// 用公钥,将查询参数加密
String encrypt1 = encryptRSAByPublicKey(JSON.toJSONString(MData1), rsaPublicKey);
System.out.println(encrypt1);
// 需要加密的内容2
String MData2 = "0123456789abcdefgxyzwzyxgfedcba9876543210";
// 用公钥,将查询参数加密
String encrypt2 = encryptRSAByPublicKey(MData2, rsaPublicKey);
System.out.println(encrypt2);
}
public static String encryptRSAByPublicKey(String json,String rsaPublicKey){
Assert.hasText(json,"明文不能为空");
Assert.hasText(rsaPublicKey,"公钥不能为空");
String cipherText = "";
try{
Base64.Decoder decoder = Base64.getDecoder();
byte[] decode = decoder.decode(rsaPublicKey);
PublicKey rsaKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode));
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,rsaKey);
//RSA加密超过117报错,采用分段加密
byte[] srcBytes = json.getBytes("UTF-8");
ByteArrayOutputStream out = new ByteArrayOutputStream();
for (int i = 0; i < srcBytes.length; i += MAX_ENCRYPT_BLOCK) {
byte[] subBytes = Arrays.copyOfRange(srcBytes, i, i + MAX_ENCRYPT_BLOCK);
//分段加密后的密文
byte[] subCipher = cipher.doFinal(subBytes);
out.write(subCipher,0,subCipher.length);
}
byte[] bytes = out.toByteArray();
Base64.Encoder encoder = Base64.getEncoder();
cipherText = encoder.encodeToString(bytes);
}catch (Exception ex){
System.out.println("RSA加密异常:" + ex.getMessage());
}
return cipherText;
}
}
解密
package com.da;
import com.alibaba.fastjson.JSON;
import org.springframework.util.Assert;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Arrays;
import java.util.Base64;
public class Wan {
// MAX_DECRYPT_BLOCK 应等于密钥长度/8(1byte=8bit),所以当密钥位数为2048时,最大解密长度应为256.
// 128 对应 1024,256对应2048
private static final int KEYSIZE = 1024;
// RSA最大加密明文大小
private static final int MAX_ENCRYPT_BLOCK = 117;
// RSA最大解密密文大小
private static final int MAX_DECRYPT_BLOCK = KEYSIZE / 8;
public static void main(String[] args) {
// 私钥
String rsaPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAO5l10lS7anPYQ98zAFyRt0kPkAa2BHvkltPolTQ+86bTL+9Lx9b9FueeWSSeKvszxH6WRdyGBxER+5FDRTWJbUllgbQFOp7NHY8cl9YChJynprPVoD5OhrWT9jwbKGzgkoMHz6GN4wVO1bQUhHy754HJD2dOtxnShnoevUBfsb9AgMBAAECgYAZf+cxPp+RRE9bervPg8u0p8XI0ZY/BOMgxTnV3KyygsYI1FGQByPyENdnPIuPyDq175NMALY3f8453ETz75wEuXAXRQ+W2lBPqMhu6dV4OB52NT9rMxT2nEvOpzKkZoW9wZlBJMpoggGF+vhZnMBaAvLb7cZ7D/iOkJcdKhR6wQJBAPoHRC0oJcoBiX1KZKRbRPkn4/Wzst7zNtC13BiqKCgSJlc4a3+lHxTK79F1SXyliqgrDAj8E+/FjQLTJ89CkVkCQQD0F3ZqSeVFWgBaptu5SvUA2i5HWnsKISQajF4qnG+3CW/o8PMWgr+FJh9mWI/j2TQLdWZvkKDvwMmfjNv6vSpFAkEAgNa7t/VHO8f8/FYYdGUfrrBylIrr8l0r8vKznvYXyUZJAYruQhFpacKFP88LdjKrt6qvAfY7o8ONvVXn3rJzyQJAYMIoO6v9SYeK2mSIdyQiiOr0K27PlU1b3XZFIckPc9Q223UgN40u1F4vVkfHCkAgpGYubA097qxSgH+69+MirQJADzzbZ1Q8k8i/sXI7095T23+urpAyA+atq+lqtAcrQoCaMikeHmm7vO54XmDiB1gdf6jBBc0aA4oVAt+F3JmHqw==";
// 需要解密的内容1
String data1 = "iukMJ7c289IbprWCgY1l4v1AvKCILfy7BDgkOcGCI+Rb+KMDdzGcg9vPo/4lw4wredMT+DhW0qhgTMt1e4rY2mkjDPkrGpTBS6BukW0zPbxMuLM6bnBOTeW39JOD3/KFgZF0h5/Iks9LhV5P/22bAc//xaGhXZHxF2ESxAK2UtQ=";
// 需要解密的内容2
String data2 = "tikRmyRFFplxm5DuB10ZhHuvzPUEJ9MuWfQdkuGWzhMnZ13FupUqNFEBtGCLVd01vVHMuTgu19X02eCGUOYD1FleLODmslCp/vnIl0HJs/F2mU0uBND8lEj+Tk5yXvYbkDVK38lICKUUBJdfnoTQMMYRTJXRiki3gsQH+u+teXw=";
String decrypt1 = decryptRSAByPrivateKey(data1, rsaPrivateKey);
System.out.println("解密后的明文1:" + decrypt1);
String decrypt2 = decryptRSAByPrivateKey(data2, rsaPrivateKey);
System.out.println("解密后的明文2:" + decrypt2);
// 去空格
System.out.println(decrypt1.trim());
System.out.println(decrypt2.trim());
System.out.println(JSON.parseObject(decrypt1).get("nijiazhunali"));
}
public static String decryptRSAByPrivateKey(String cipherText,String rsaPrivateKey){
Assert.hasText(cipherText,"密文不能为空");
Assert.hasText(rsaPrivateKey,"私钥不能为空");
String json = "";
try{
Base64.Decoder privateDecoder = Base64.getDecoder();
byte[] decodePrivateKey = privateDecoder.decode(rsaPrivateKey);
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decodePrivateKey));
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
Base64.Decoder decoder = Base64.getDecoder();
byte[] cipherBytes = decoder.decode(cipherText);
ByteArrayOutputStream out = new ByteArrayOutputStream();
for (int i = 0; i < cipherBytes.length; i += MAX_DECRYPT_BLOCK) {
byte[] subBytes = Arrays.copyOfRange(cipherBytes, i, i + MAX_DECRYPT_BLOCK);
//分段解密
byte[] subCipher = cipher.doFinal(subBytes);
out.write(subCipher,0,subCipher.length);
}
json = new String(out.toByteArray(),"UTF-8");
}catch (Exception ex){
System.out.println("RSA解密异常:" + ex.getMessage());
}
return json;
}
}
JavaScript
<script src="jsencrypt.min.js" type="text/javascript" charset="utf-8"></script>
function JiaMi() {
// 需要加密的内容1
var MData1 = {
"今天是几月": "202305",
"nijiazhuna": "地球上"
};
// 需要加密的内容2
var MData2 = "123456789abcdefggfedcba987654321"
// 公钥
var rsaPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDuZddJUu2pz2EPfMwBckbdJD5AGtgR75JbT6JU0PvOm0y/vS8fW/Rbnnlkknir7M8R+lkXchgcREfuRQ0U1iW1JZYG0BTqezR2PHJfWAoScp6az1aA+Toa1k/Y8Gyhs4JKDB8+hjeMFTtW0FIR8u+eByQ9nTrcZ0oZ6Hr1AX7G/QIDAQAB";
// 开始加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey(rsaPublicKey);
// 对于非字符串的内容,加密时需要转换
var m1 = encrypt.encrypt(JSON.stringify(MData1));
console.log(m1);
// 字符串可以直接加密
var m2 = encrypt.encrypt(MData2);
console.log(m2);
}
function JieMi() {
// 需要解密的内容1
var M1 = "p+QvepVbHTmBpOQTIyNDyuP4J6jKOlwk3C87LeCcRU852NKLWBgAGJtVAvABGCRy4Td2uNohp/UL5r9tphy89AgkLfCp+IkUXZ6Q6ZN3JFdn0BU6SzedBU9+mK2PnouoSffZ5aCeNw/cax+PgX/4a0VM7priWFQcll5kV3Eto3Q=";
// 需要解密的内容2
var M2 = "xyNVjG1Xv4xTYeHv/43I4pwKt2HNpOXbJ1F3FGJ6t1IZ4uYKyY5vxlPTEdPnmLRRxyYHD4v87lhflSWW+XrJ1gkyA5923tqpHtkYwfLSU5Fp1Y0I3CSAhrThUsVDOcbrWHItNv5D1QOqtSpF1xIk2DA6v1F2p1Jn26JPnaJwuqM=";
// 私钥
var rsaPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAO5l10lS7anPYQ98zAFyRt0kPkAa2BHvkltPolTQ+86bTL+9Lx9b9FueeWSSeKvszxH6WRdyGBxER+5FDRTWJbUllgbQFOp7NHY8cl9YChJynprPVoD5OhrWT9jwbKGzgkoMHz6GN4wVO1bQUhHy754HJD2dOtxnShnoevUBfsb9AgMBAAECgYAZf+cxPp+RRE9bervPg8u0p8XI0ZY/BOMgxTnV3KyygsYI1FGQByPyENdnPIuPyDq175NMALY3f8453ETz75wEuXAXRQ+W2lBPqMhu6dV4OB52NT9rMxT2nEvOpzKkZoW9wZlBJMpoggGF+vhZnMBaAvLb7cZ7D/iOkJcdKhR6wQJBAPoHRC0oJcoBiX1KZKRbRPkn4/Wzst7zNtC13BiqKCgSJlc4a3+lHxTK79F1SXyliqgrDAj8E+/FjQLTJ89CkVkCQQD0F3ZqSeVFWgBaptu5SvUA2i5HWnsKISQajF4qnG+3CW/o8PMWgr+FJh9mWI/j2TQLdWZvkKDvwMmfjNv6vSpFAkEAgNa7t/VHO8f8/FYYdGUfrrBylIrr8l0r8vKznvYXyUZJAYruQhFpacKFP88LdjKrt6qvAfY7o8ONvVXn3rJzyQJAYMIoO6v9SYeK2mSIdyQiiOr0K27PlU1b3XZFIckPc9Q223UgN40u1F4vVkfHCkAgpGYubA097qxSgH+69+MirQJADzzbZ1Q8k8i/sXI7095T23+urpAyA+atq+lqtAcrQoCaMikeHmm7vO54XmDiB1gdf6jBBc0aA4oVAt+F3JmHqw==";
// 开始解密
var decrypt = new JSEncrypt();
decrypt.setPrivateKey(rsaPrivateKey);
// 输出解密内容
console.log(decrypt.decrypt(M1));
console.log(decrypt.decrypt(M2));
}
MD5
Java
package com.da;
import com.alibaba.fastjson.JSON;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
public class Wan {
public static void main(String[] args) throws UnsupportedEncodingException {
// 需要加密的内容1
Map<String,String> MData1 = new HashMap<>();
MData1.put("今天是啥日子","20230501");
MData1.put("nijiazhunali","真在地球上");
// 需要加密的内容2
String MData2 = "0123456789abcdefgxyzwzyxgfedcba9876543210";
String md5_1 = DigestUtils.md5Hex(JSON.toJSONString(MData1).getBytes("UTF-8")).toUpperCase();
String md5_2 = DigestUtils.md5Hex(MData2.getBytes("UTF-8")).toUpperCase();
System.out.println(md5_1);
System.out.println(md5_2);
}
}
JavaScript
<script src="md5.js" type="text/javascript" charset="utf-8"></script>
// c31c225ffb090c04fcff568cf895609d
let hash = md5("huageyuan");
//当然也可以嵌套使用
// a4b8d86ec2a55efdeebc2574947ae33f
let hash2 = md5(md5('huageyuan'));
console.log(hash);
console.log(hash2);
插件也可以使用网上的,比如
<script src="https://cdn.bootcdn.net/ajax/libs/blueimp-md5/2.19.0/js/md5.js"></script>
这是blueimp-md5插件地址,可以自行选择其他版本。
https://www.bootcdn.cn/blueimp-md5/
JS相关插件
https://download.youkuaiyun.com/download/qq_55342245/87960719
https://download.youkuaiyun.com/download/qq_55342245/87960721