DES加密,前端示例,Java示例,在线测试

前端DES加密

<script type="text/javascript" src="../js/crypto-js-4.1.1/crypto-js.js"></script>

	var str = 'admin123';
	var key = 'comjxs12';
	var iv = 'on@12345';

	key = CryptoJS.enc.Utf8.parse(key);
	iv = CryptoJS.enc.Utf8.parse(iv);

	// DES 加密
	var Encrypt = function () {
		var encrypted = CryptoJS.DES.encrypt(str, key, {
			iv: iv,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7
		});
		// 转换为字符串
		encrypted = encrypted.toString();
		return encrypted;
	}


	// DES 解密
	var Decrypt = function (encrypted) {
		var decrypted = CryptoJS.DES.decrypt(encrypted, key, {
			iv: iv,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7
		});
		// 转换为 utf8 字符串
		decrypted = CryptoJS.enc.Utf8.stringify(decrypted);
		return decrypted;
	}
	
	//加密
    var desMessage = Encrypt();
	console.log(desMessage);
	//解密
	var pw = Decrypt(desMessage);
	console.log(pw);

输出结果:
在这里插入图片描述

Java DES加密

package com.test

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.spec.AlgorithmParameterSpec;

/**
 * Cipher 密码工具类
 *
 * @author
 * @version 1.0
 * @date
 */

public class CipherUtils {
    /**
     * DES/CBC/PKCS5Padding 加密
     *
     * @param content    :待加密的内容.
     * @param secret_key :用于生成密钥的 key,自定义便可,加密与解密必须使用同一个,若是不一致,则抛出异常
     * @param vector_key 用于生成算法参数规范的 key,自定义便可,加密与解密必须使用同一个,若是不一致,解密的内容可能会形成与源内容不一致.
     *                   <p>
     *                   一、secret_key、vector_key: AES 时必须是 16 个字节,DES 时必须是 8 字节.
     *                   二、secret_key、vector_key 值不建议使用中文,若是是中文,注意一个汉字是3个字节。
     *                   </p>
     * @return 返回 Cipher 加密后的数据,对加密后的字节数组用 Base64 进行编码转成了可视字符串,如 7giH2bqIMH3kDMIg8gq0nY
     * @throws Exception
     *
     */
    public static String encrypt(String content, String secret_key, String vector_key) throws Exception {
        //实例化 Cipher 对象。使用:AES-高级加密标准算法、CBC-有向量模式、PKCS5Padding-填充方案:(加密内容不足8位时用余位数补足8位)
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        //使用 SecretKeySpec(byte[] key, String algorithm) 建立密钥. 算法要与 Cipher.getInstance 保持一致.
        SecretKey secretKey = new SecretKeySpec(secret_key.getBytes(), "DES");
        /**
         * init(int opMode,Key key,AlgorithmParameterSpec params):初始化 Cipher,
         * 一、Cipher.ENCRYPT_MODE 表示加密模式
         * 二、key 表示加密密钥
         * 三、params 表示算法参数规范,使用 CBC 有向量模式时,必须传入,若是是 ECB-无向量模式,那么能够不传
         * 四、全部参数规范都必须实现 {@link AlgorithmParameterSpec} 接口.
         */
        IvParameterSpec parameterSpec = new IvParameterSpec(vector_key.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
        /**
         * byte[] doFinal(byte[] content):对 content 完成加密操做,若是 cipher.init 初始化时使用的解密模式,则此时是解密操做.
         * 返回的是加密后的字节数组,若是直接 new String(byte[] bytes) 是会乱码的,能够借助 BASE64 转为可视字符串,或者转成 16 进制字符
         */
        byte[] encrypted = cipher.doFinal(content.getBytes());
        //BASE64Encoder.encode:BASE64 对字节数组内容进行编码,转为可视字符串,这样方便存储和转换.
        String base64Encode = new BASE64Encoder().encode(encrypted);
        return base64Encode;
    }

    /**
     * DES/CBC/PKCS5Padding 解密
     *
     * @param base64Encode :待解密的内容,由于加密时使用了 Base64 进行了编码,因此这里传入的也是 Base64 编码后的可视化字符串
     * @param secret_key   :用于生成密钥的 key,自定义便可,加密与解密必须使用同一个,若是不一致,则抛出异常
     * @param vector_key   用于生成算法参数规范的 key,自定义便可,加密与解密必须使用同一个,若是不一致,解密的内容可能会形成与源内容不一致.
     *                     <p>
     *                     一、secret_key、vector_key:AES 时必须是 16 个字节,DES 时必须是 8 字节.
     *                     二、secret_key、vector_key 值不建议使用中文,若是是中文,注意一个汉字是3个字节。
     *                     </p>
     * @return
     * @throws
     */
    public static String decrypt(String base64Encode, String secret_key, String vector_key) throws Exception {
        //实例化 Cipher 对象。加密算法/反馈模式/填充方案,解密与加密须要保持一致.
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        //建立密钥。算法也要与实例化 Cipher 一致.
        SecretKey secretKey = new SecretKeySpec(secret_key.getBytes(), "DES");
        //有向量模式(CBC)须要传入 AlgorithmParameterSpec 算法参数规范参数.
        IvParameterSpec parameterSpec = new IvParameterSpec(vector_key.getBytes());
        //初始化 cipher。使用解密模式.
        cipher.init(Cipher.DECRYPT_MODE, secretKey, parameterSpec);
        //将 Base64 编码的内容解码成字节数组(由于加密的时候,对密文使用了 Base64编码,因此这里须要先解码)
        byte[] content = new BASE64Decoder().decodeBuffer(base64Encode);
        //执行解密操做。返回解密后的字节数组,此时可使用 String(byte bytes[]) 转成源字符串.
        byte[] decrypted = cipher.doFinal(content);
        return new String(decrypted);
    }

    public static void main(String[] args) throws Exception {
        String content = "admin123";
        //生成密钥的 key 与 生成算法参数规范的 key 加解密必须一致,它就像是一把钥匙或者口令,不能忘记.
        //AES 加密算法时必须是 16 个字节,DES 时必须是 8 字节.
        String slatKey = "comjxs12";
        String vectorKey = "on@12345";
        String encrypt = encrypt(content, slatKey, vectorKey);
        System.out.println("源内容:\n" + content);
        System.out.println("加密后:\n" + encrypt);
        System.out.println("解密后:\n" + decrypt(encrypt, slatKey, vectorKey));
    }
}

输出结果:
源内容:
admin123
加密后:
OgKg52kPeRdCJplUDaaDsg==
解密后:
admin123

在线加密工具

https://www.the-x.cn/zh-cn/cryptography/Des.aspx
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山月神话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值