c#语言AES CBC模式加解密数据实现

  在多可文档系统中文件接口需要和其他系统实现用户统一登录,其他数据加密传输,要保障算法和数据的一致性    对系统接口使用有很大帮助。系统选择使用AES加密算法的CBC模式(128位密钥),实现各系统间加密数据的传输。多可提供各种语言的算法实现,以下是c#语言的具体算法实现(其他语言参考博主相关文章):


 

using System;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
          
        public static string AesDecrypt(string encryptText, string key, string iv)
        {  
            key = key.Substring(0, 16);
            //
            if (string.IsNullOrEmpty(encryptText)) return string.Empty;
            if (key == null) throw new Exception("未将对象引用设置到对象的实例。");
            if (key.Length < 16) throw new Exception("指定的密钥长度不能少于16位。");
            if (key.Length > 32) throw new Exception("指定的密钥长度不能多于32位。");
            if (key.Length != 16 && key.Length != 24 && key.Length != 32) throw new Exception("指定的密钥长度不明确。");
            if (!string.IsNullOrEmpty(iv))
            {
                if (iv.Length < 16) throw new Exception("指定的向量长度不能少于16位。");
            }
             
            var _valueByte = new byte[encryptText.Length / 2];
            for (var x = 0; x < _valueByte.Length; x++)
            {
                var i = Convert.ToInt32(encryptText.Substring(x * 2, 2), 16);
                _valueByte[x] = (byte)i;
            }

            using (var aes = new RijndaelManaged())
            {
                aes.IV = Encoding.UTF8.GetBytes(iv);
                aes.Key = Encoding.UTF8.GetBytes(key);
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.Zeros; 
                var cryptoTransform = aes.CreateDecryptor();
                var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);

                return UTF8Encoding.UTF8.GetString(resultArray);
            }
        }

        public static string AesEncrypt(string inText, string key, string iv)
        {
            key = key.Substring(0, 16);
            //
            if (string.IsNullOrEmpty(inText)) return string.Empty;
            if (key == null) throw new Exception("未将对象引用设置到对象的实例。");
            if (key.Length < 16) throw new Exception("指定的密钥长度不能少于16位。");
            if (key.Length > 32) throw new Exception("指定的密钥长度不能多于32位。");
            if (key.Length != 16 && key.Length != 24 && key.Length != 32) throw new Exception("指定的密钥长度不明确。");
            if (!string.IsNullOrEmpty(iv))
            {
                if (iv.Length < 16) throw new Exception("指定的向量长度不能少于16位。");
            }

            Byte[] toEncryptArray = System.Text.Encoding.UTF8.GetBytes(inText);
            using (var aes = new RijndaelManaged())
            {
                aes.IV = Encoding.UTF8.GetBytes(iv);
                aes.Key = Encoding.UTF8.GetBytes(key);
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.Zeros;
                var cTransform = aes.CreateEncryptor();
                var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 
                StringBuilder ret = new StringBuilder();
                foreach (byte b in resultArray)
                { 
                    ret.AppendFormat("{0:x2}", b);
                }
 
                return ret.ToString();
            }
        }


        static void Main(string[] args)
        {
            string iv = "1234567890ABCDEF"; //初始化向量
            string key = "2018201820182018";    //16位密码,修改为设置后密码
            string inText = "多可文档管理系统";
			//outStr = 051a291770a6b4fbdb117d1f128c864433e6433a342cc822f7e27d75245d3c6e
            var outStr = AesEncrypt(inText, key, iv); 
            Console.WriteLine(outStr);
			
			//
            var outStr2 = AesDecrypt(outStr, key, iv);
            Console.WriteLine(outStr2);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值