RSA和MD5加密(Java和JavaScript)

RSA和MD5加密(Java和JavaScript)

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.csdn.net/download/qq_55342245/87960719

https://download.csdn.net/download/qq_55342245/87960721

猜你喜欢

转载自blog.csdn.net/qq_55342245/article/details/131437168
今日推荐