首先需要引入crypto-js
import CryptoJS from 'crypto-js'
//DES加密
EncryptDes:function(message, key){
var keyHex = CryptoJS.enc.Utf8.parse(key);
var ivHex = CryptoJS.enc.Utf8.parse(key);
let encrypted = CryptoJS.DES.encrypt(message, keyHex, {
iv:ivHex, //要与C#端的一致
mode: CryptoJS.mode.CBC, //要与C#端的一致
padding:CryptoJS.pad.Pkcs7//要与C#端的一致
}
);
return encrypted.toString();
//return encrypted.ciphertext.toString() // 返回hex格式密文,如需返回base64格式:encrypted.toString()
},
//DES解密
DecryptDes:function(ciphertext, key){
var keyHex = CryptoJS.enc.Utf8.parse(key);
var ivHex = CryptoJS.enc.Utf8.parse(key);
var decrypted = CryptoJS.DES.decrypt({
ciphertext: CryptoJS.enc.Hex.parse(ciphertext)
}, keyHex, {
iv:ivHex, //要与C#端的一致
mode: CryptoJS.mode.CBC, //要与C#端的一致
padding: CryptoJS.pad.Pkcs7//要与C#端的一致
});
return decrypted.toString(CryptoJS.enc.Utf8);
},
JS调用
let pwd = EncryptDes('abcd1234',encryptKey) // encryptKey是8个字符
let base64 = Buffer.from(pwd, 'base64');
let hex = base64.toString('hex')
let ddd = this.$common.DecryptDes(hex,encryptKey);
C#的DES加解密代码
/// <summary>
/// DES加密
/// </summary>
/// <param name="input"></param>
/// <param name="encryptKey">加密解密所用密钥</param>
/// <returns></returns>
public static string DESEncrypt(this string input, string encryptKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();//实例化加密类对象
{
//要与js加密一致,需要设置偏移
//byte[] iv = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
//des.IV = iv;
}
//定义字节数组用来存放密钥 GetBytes方法用于将字符串中所有字节编码为一个字节序列
////!!!DES加密key位数只能是64位,即8字节
////注意这里用的编码用当前默认编码方式,不确定就用Default
byte[] arr_key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
byte[] arr_str = Encoding.UTF8.GetBytes(input);//定义字节数组存放要加密的字符串
MemoryStream ms = new MemoryStream();//实例化内存流对象
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(arr_key, arr_key), CryptoStreamMode.Write);//创建加密流对象,参数 内存流/初始化向量IV/加密流模式
//需加密字节数组/offset/length,此方法将length个字节从 arr_str 复制到当前流。0是偏移量offset,即从指定index开始复制。
cs.Write(arr_str, 0, arr_str.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="input"></param>
/// <param name="decodeKey">加密解密所用密钥</param>
/// <returns></returns>
public static string DESDecode(this string input, string decodeKey)
{
MemoryStream ms = new MemoryStream();
byte[] arr_key = Encoding.UTF8.GetBytes(decodeKey.Substring(0, 8));
//注意这里仍要将密文作为base64字符串处理获得数组,否则报错
//byte[] arr_des = Encoding.UTF8.GetBytes(str_des);
//不可行,将加密方法中ms的字符数组转为utf-8也不行
byte[] arr_des = Convert.FromBase64String(input);
//解密方法定义加密对象
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
{
//要与js加密一致,需要设置偏移
//byte[] iv = Encoding.UTF8.GetBytes(decodeKey.Substring(0, 8));
//des.IV = iv;
}
var cs = new CryptoStream(ms, des.CreateDecryptor(arr_key, arr_key), CryptoStreamMode.Write);
cs.Write(arr_des, 0, arr_des.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}