前端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