C#编程之CryptoJS与C#AES加解密互转
小标 2018-10-22 来源 : 阅读 3055 评论 0

摘要:本文主要向大家介绍了C#编程之CryptoJS与C#AES加解密互转,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之CryptoJS与C#AES加解密互转,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。


JS端AES加密解密:

 1     com.str = {
 2         _KEY: "12345678900000001234567890000000",//32位
 3         _IV: "1234567890000000",//16位
 4         /**************************************************************
 5         *字符串加密
 6         *   str:需要加密的字符串
 7         ****************************************************************/
 8         Encrypt: function (str) {
 9             var key = CryptoJS.enc.Utf8.parse(this._KEY); 
10             var iv = CryptoJS.enc.Utf8.parse(this._IV);
11 
12             var encrypted = ‘‘;
13 
14             var srcs = CryptoJS.enc.Utf8.parse(str);
15             encrypted = CryptoJS.AES.encrypt(srcs, key, {
16                 iv: iv,
17                 mode: CryptoJS.mode.CBC,
18                 padding: CryptoJS.pad.Pkcs7
19             });
20 
21             return encrypted.ciphertext.toString();
22         },
23 
24         /**************************************************************
25         *字符串解密
26         *   str:需要解密的字符串
27         ****************************************************************/
28         Decrypt: function (str) {
29             var key = CryptoJS.enc.Utf8.parse(this._KEY);
30             var iv = CryptoJS.enc.Utf8.parse(this._IV);
31             var encryptedHexStr = CryptoJS.enc.Hex.parse(str);
32             var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
33             var decrypt = CryptoJS.AES.decrypt(srcs, key, {
34                 iv: iv,
35                 mode: CryptoJS.mode.CBC,
36                 padding: CryptoJS.pad.Pkcs7
37             });
38             var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
39             return decryptedStr.toString();
40         }
41     }

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();
    }

 
用法:

com.str.Encrypt("2017-05")//结果:68f4a7903a9fe6085d2301ac68cc039c
com.str.Decrypt("68f4a7903a9fe6085d2301ac68cc039c")//结果:2017-05


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

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程