CryptoJS与C#AES加解密互转

转载连接:https://www.cnblogs.com/wz122889488/p/6899615.html

页面js引用:

 
    

JS端AES加密解密:

/**************************************************************
    *字符串加密
    *   str:需要加密的字符串
    ****************************************************************/
    function Encrypt(str) {
        var KEY = "12345678900000001234567890000000";//32位
        var IV = "1234567890000000";//16位
        var key = CryptoJS.enc.Utf8.parse(KEY);
        var iv = CryptoJS.enc.Utf8.parse(IV);

        var encrypted = '';

        var srcs = CryptoJS.enc.Utf8.parse(str);
        encrypted = CryptoJS.AES.encrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });

        return encrypted.ciphertext.toString();
    }
    /**************************************************************
    *字符串解密
    *   str:需要解密的字符串
    ****************************************************************/
    function Decrypt(str) {
        var KEY = "12345678900000001234567890000000";//32位
        var IV = "1234567890000000";//16位
        var key = CryptoJS.enc.Utf8.parse(KEY);
        var iv = CryptoJS.enc.Utf8.parse(IV);
        var encryptedHexStr = CryptoJS.enc.Hex.parse(str);
        var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
        var decrypt = CryptoJS.AES.decrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
        return decryptedStr.toString();
    }

C# AES加密解密:

const string AES_IV = "1234567890000000";//16位    

    ///   
    /// AES加密算法  
    ///   
    /// 明文字符串  
    /// 密钥(32位)  
    /// 字符串  
    public static string EncryptByAES(string input, string key)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32));
        using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            aesAlg.Key = keyBytes;
            aesAlg.IV = Encoding.UTF8.GetBytes(AES_IV.Substring(0, 16));

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(input);
                    }
                    byte[] bytes = msEncrypt.ToArray();
                    return ByteArrayToHexString(bytes);
                }
            }
        }
    }

    ///   
    /// AES解密  
    ///   
    /// 密文字节数组  
    /// 密钥(32位)  
    /// 返回解密后的字符串  
    public static string DecryptByAES(string input, string key)
    {
        byte[] inputBytes = HexStringToByteArray(input); 
        byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32));
        using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            aesAlg.Key = keyBytes;
            aesAlg.IV = Encoding.UTF8.GetBytes(AES_IV.Substring(0, 16));

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
            using (MemoryStream msEncrypt = new MemoryStream(inputBytes))
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srEncrypt = new StreamReader(csEncrypt))
                    {
                        return srEncrypt.ReadToEnd();
                    }
                }
            }
        }
    }

    /// 
    /// 将指定的16进制字符串转换为byte数组
    /// 
    /// 16进制字符串(如:“7F 2C 4A”或“7F2C4A”都可以)
    /// 16进制字符串对应的byte数组
    public static byte[] HexStringToByteArray(string s)
    {
        s = s.Replace(" ", "");
        byte[] buffer = new byte[s.Length / 2];
        for (int i = 0; i < s.Length; i += 2)
            buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
        return buffer;
    }

    /// 
    /// 将一个byte数组转换成一个格式化的16进制字符串
    /// 
    /// byte数组
    /// 格式化的16进制字符串
    public static string ByteArrayToHexString(byte[] data)
    {
        StringBuilder sb = new StringBuilder(data.Length * 3);
        foreach (byte b in data)
        {
            //16进制数字
            sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
            //16进制数字之间以空格隔开
            //sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
        }
        return sb.ToString().ToUpper();
    }

用法:

Encrypt("2017-05")//结果:68f4a7903a9fe6085d2301ac68cc039c
Decrypt("68f4a7903a9fe6085d2301ac68cc039c")//结果:2017-05
//加密
string str1 = Encrypt.EncryptByAES("2017-05", "12345678900000001234567890000000");
//解密
string str2 = Encrypt.DecryptByAES("68f4a7903a9fe6085d2301ac68cc039c", "12345678900000001234567890000000");

你可能感兴趣的:(前端开发)