欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript与JAVA相互实现DES加解和解密处理

程序员文章站 2022-03-08 15:49:59
javascript 用CryptoJS实现DES加解密处理 有关 CryptoJS, 请 参考:https://github.com/sytelus/CryptoJS/tree/master/componentsA. JAVA 部分package com.aerchi.Utility;import java.security.Key;import java.security.spec.AlgorithmParameterSpec;import javax.crypto.C......

JavaScript与JAVA相互实现DES加解密处理
     
有关JavaScript的 CryptoJS, 请 参考: https://github.com/sytelus/CryptoJS/tree/master/components
 

A. JAVA 部分

package com.aerchi.Utility;

import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import android.util.Base64;

/**
 * 使用DES加密和解密工具类
 * 
 * @author Administrator
 * 
 */
public class DesUtility
{

	private Key key;// 密钥的key值
	private byte[] DESkey;
	// e2fd7b1n
	private byte[] DESIV = { 'e', '2', 'f', 'd', '7', 'b', '1', 'n' };
	private AlgorithmParameterSpec iv = null;// 加密算法的参数接口

	public DesUtility()
	{
		try
		{
			this.DESkey = "&da0f@4d".getBytes("UTF-8");// 设置密钥
			DESKeySpec keySpec = new DESKeySpec(DESkey);// 设置密钥参数
			iv = new IvParameterSpec(DESIV);// 设置向量
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 获得密钥工厂
			key = keyFactory.generateSecret(keySpec);// 得到密钥对象
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * 加密String 明文输入密文输出
	 * 
	 * @param inputString
	 *            待加密的明文
	 * @return 加密后的字符串
	 */
	public String getEnc(String inputString)
	{
		byte[] byteMi = null;
		byte[] byteMing = null;
		String outputString = "";
		try
		{
			byteMing = inputString.getBytes("UTF-8");
			byteMi = this.getEncCode(byteMing);
			byte[] temp = Base64.encode(byteMi, Base64.DEFAULT);			
			outputString = new String(temp);
			//outputString=new String(byteMi, "UTF8");
		}
		catch (Exception e)
		{
		}
		finally
		{
			byteMing = null;
			byteMi = null;
		}
		return outputString;
	}

	/**
	 * 解密String 以密文输入明文输出
	 * 
	 * @param inputString
	 *            需要解密的字符串
	 * @return 解密后的字符串
	 */
	public String getDec(String inputString)
	{
		byte[] byteMing = null;
		byte[] byteMi = null;
		String strMing = "";
		try
		{
			byteMi = Base64.decode(inputString.getBytes(), Base64.DEFAULT);
			byteMing = this.getDesCode(byteMi);
			strMing = new String(byteMing, "UTF8");
		}
		catch (Exception e)
		{
		}
		finally
		{
			byteMing = null;
			byteMi = null;
		}
		return strMing;
	}

	/**
	 * 加密以byte[]明文输入,byte[]密文输出
	 * 
	 * @param bt
	 *            待加密的字节码
	 * @return 加密后的字节码
	 */
	private byte[] getEncCode(byte[] bt)
	{
		byte[] byteFina = null;
		Cipher cipher;
		try
		{
			// 得到Cipher实例
			cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE, key, iv);
			byteFina = cipher.doFinal(bt);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			cipher = null;
		}
		return byteFina;
	}

	/**
	 * 解密以byte[]密文输入,以byte[]明文输出
	 * 
	 * @param bt
	 *            待解密的字节码
	 * @return 解密后的字节码
	 */
	private byte[] getDesCode(byte[] bt)
	{
		Cipher cipher;
		byte[] byteFina = null;
		try
		{
			// 得到Cipher实例
			cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, key, iv);
			byteFina = cipher.doFinal(bt);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			cipher = null;
		}
		return byteFina;
	}
}

 

B: JavaScript 

关于引入文件, 请把  https://github.com/sytelus/CryptoJS/tree/master/rollups 全部复制到本地, 并引入 rollups/tripledes.js 文件
1. ECB 加解密

	//需要引入 CryptoJS里的tripledes.js 和 mode-ecb.js文件
	<script type="text/javascript">
		var DesECBUtil = {
			key: '&da0f@4d',//加密密钥
			//加密
			encrypt: function(message) {
				let keyHex = CryptoJS.enc.Utf8.parse(this.key);
				let encrypted = CryptoJS.DES.encrypt(message, keyHex, {
					mode: CryptoJS.mode.ECB,
					padding: CryptoJS.pad.Pkcs7
				});
				return encrypted.toString();
			},
			//解密
			decrypt: function(cipherStr) {
				let keyHex = CryptoJS.enc.Utf8.parse(this.key);
				// direct decrypt cipherStr
				let decrypted = CryptoJS.DES.decrypt({
					ciphertext: CryptoJS.enc.Base64.parse(cipherStr)
				}, keyHex, {
					mode: CryptoJS.mode.ECB,
					padding: CryptoJS.pad.Pkcs7
				});
				return decrypted.toString(CryptoJS.enc.Utf8);
			}
		};

	    let ori_pw_str = 'adx3650', pw_str, en_pw_str;

		//加密
		en_pw_str = DesECBUtil.encrypt(ori_pw_str);

		//解密
		pw_str = DesECBUtil.decrypt(en_pw_str);

		console.log(`原始: ${ori_pw_str} , 加密: '${en_pw_str}' , 解密: '${pw_str}'`);
        //原始: adx3650 , 加密: 'AnFhzXnYEjk=' , 解密: 'adx3650'

	</script>

 

2. ECB , CBC 加解密

	//需要引入 CryptoJS里的tripledes.js 文件
	<script type="text/javascript">
		/**
		 * @Author:  aerchi
		 * @Email:   aerchi@gmail.com
		 * @Date:    2020-12-29 10:52:23
		 * @Description: Des ECB CBC 加解密工具
		 */

	    var DesUtil = {
	    	key: '&da0f@4d', //加密密钥
	    	ivStr: 'e2fd7b1n', //矢量
	    	ivArray: [0x65, 0x32, 0x66, 0x64, 0x37,  0x62, 0x31, 0x6E], //矢量16进制数组, 等同于 ivStr

	    	// 16进制数组转换成字符串
		    getStrFromBytes: function(arr) {
		        let r = "";
		        for(let i=0; i<arr.length; i++){
		            r += String.fromCharCode(arr[i]);
		        }
		        // console.log(r);
		        return r;
		    },
            //ECB加密
		    encryptECB: function(message) {
		    	let keyHex = CryptoJS.enc.Utf8.parse(this.key); // 将秘钥转换为utf8格式
				let encrypted = CryptoJS.DES.encrypt(message, this.keyHex, {
					mode: CryptoJS.mode.ECB,
					padding: CryptoJS.pad.Pkcs7
				});
				return encrypted.toString();
			},
			//ECB解密
			decryptECB: function(cipherStr) {
				let keyHex = CryptoJS.enc.Utf8.parse(this.key); // 将秘钥转换为utf8格式
				// direct decrypt cipherStr
				let decrypted = CryptoJS.DES.decrypt(
					{ciphertext: CryptoJS.enc.Base64.parse(cipherStr)},
					keyHex,
					{
						mode: CryptoJS.mode.ECB,
						padding: CryptoJS.pad.Pkcs7
					}
				);
				return decrypted.toString(CryptoJS.enc.Utf8);
			},

	    	//CBC加密
	    	encryptCBC: function(str) {
	    		let keyHex =  CryptoJS.enc.Utf8.parse(this.key);
	    		let ivHex = CryptoJS.enc.Utf8.parse(this.ivStr);
	    		// let ivHex = CryptoJS.enc.Utf8.parse(this.getStrFromBytes(this.ivArray)); // 将向量装换位字符串再转为utf8
				let encrypted = CryptoJS.DES.encrypt(str, // 因为Java加密时进行了Base64编码,所以此处解码
					keyHex,
					{
						iv: ivHex,
						mode: CryptoJS.mode.CBC, // 模式有很多种,由Java代码知道使用的是CBC
						padding: CryptoJS.pad.Pkcs7 // 填充模式有很多种,但是Java用的Pkcs5,此处Pkcs7也是可以解密的
					}
				);
				return encrypted.toString();
			},
			//CBC解密
			decryptCBC: function(cipherStr) {
				let keyHex =  CryptoJS.enc.Utf8.parse(this.key);
				let ivHex = CryptoJS.enc.Utf8.parse(this.ivStr);
	    		// let ivHex = CryptoJS.enc.Utf8.parse(this.getStrFromBytes(this.ivArray)); // 将向量装换位字符串再转为utf8
				// direct decrypt ciphertext
				let decrypted = CryptoJS.DES.decrypt({
						ciphertext: CryptoJS.enc.Base64.parse(cipherStr) // 因为Java加密时进行了Base64编码,所以此处解码
					}, keyHex, {
						iv: ivHex,
						mode: CryptoJS.mode.CBC,
						padding: CryptoJS.pad.Pkcs7
					});
				return decrypted.toString(CryptoJS.enc.Utf8);
			}
	    };

		var pw = 'adx3650', // 待解密密文
			enpw = 'GFFHGDZY8YU=',   // 待解密密文
			enStr, str;

		enStr = DesUtil.encryptCBC(pw);
		console.log(`原始: ${pw} , 解密: '${pw}' , 加密: '${enStr}'`);
		//原始: adx3650 , 解密: 'adx3650' , 加密: 'GFFHGDZY8YU='

		str = DesUtil.decryptCBC(enpw);
		console.log(`原始: ${pw} , 加密: '${enpw}' , 解密: '${str}'`);
        //原始: adx3650 , 加密: 'GFFHGDZY8YU=' , 解密: 'adx3650'
	</script>

 

完整示例参考: https://download.csdn.net/download/aerchi/13979644


乐意黎

2020-12-29

本文地址:https://blog.csdn.net/aerchi/article/details/111907403