首先需要引入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());

}