前言

对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣,知其所以然那就达不到了,利用AES加密更加安全,上一篇园友又提出,所以借着这个机会刚好用到加密和解密,同时我也已将项目中DES加密已替换为AES,在这里介绍一下。

AES加密介绍

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。它要求区块大小必须为128位,而密钥长度则可以为128、196、256位。基于此我们来实现.NET Framework版本和.NET Core版本。

在.NET Framework中实现AES加密和解密

AES加密

        public static string EncryptText(string input, string key){byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);byte[] passwordBytes = Encoding.UTF8.GetBytes(key);passwordBytes = SHA256.Create().ComputeHash(passwordBytes);byte[] bytesEncrypted = AESEncryptBytes(bytesToBeEncrypted, passwordBytes);string result = Convert.ToBase64String(bytesEncrypted);return result;}

        public static byte[] AESEncryptBytes(byte[] bytesToBeEncrypted, byte[] passwordBytes){byte[] encryptedBytes = null;var saltBytes = new byte[9] { 13, 34, 27, 67, 189, 255, 104, 219 ,122};using (var ms = new MemoryStream()){using (var AES = new RijndaelManaged()){AES.KeySize = 256;AES.BlockSize = 128;var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);AES.Key = key.GetBytes(32);AES.IV = key.GetBytes(16);AES.Mode = CipherMode.CBC;using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)){cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);cs.Close();}encryptedBytes = ms.ToArray();}}return encryptedBytes;}

上述盐字节必须为至少8个字节,否则报错如下:

AES解密

        public static string DecryptText(string input, string key){byte[] bytesToBeDecrypted = Convert.FromBase64String(input);byte[] passwordBytes = Encoding.UTF8.GetBytes(key);passwordBytes = SHA256.Create().ComputeHash(passwordBytes);byte[] bytesDecrypted = AESDecryptBytes(bytesToBeDecrypted, passwordBytes);string result = Encoding.UTF8.GetString(bytesDecrypted);return result;}

        public static byte[] AESDecryptBytes(byte[] bytesToBeDecrypted, byte[] passwordBytes){byte[] decryptedBytes = null;var saltBytes = new byte[9] { 13, 34, 27, 67, 189, 255, 104, 219 ,122};using (var ms = new MemoryStream()){using (var AES = new RijndaelManaged()){AES.KeySize = 256;AES.BlockSize = 128;var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);AES.Key = key.GetBytes(32);AES.IV = key.GetBytes(16);AES.Mode = CipherMode.CBC;using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write)){cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);cs.Close();}decryptedBytes = ms.ToArray();}}return decryptedBytes;}

测试如下:

            var encrptText = "Jeffcky";var key = Guid.NewGuid().ToString("N");Console.WriteLine("加密前内容:" + encrptText);var input = EncryptText(encrptText,key);Console.WriteLine("加密后字符串为:" + input);var text = DecryptText(input, key);Console.WriteLine("解密后内容:" + text);

上述利用 RijndaelManaged 来实例化AES,最终该类继承自 SymmetricAlgorithm 对称算法类。通过我们实例化一个 Rfc2898DeriveBytes 来对密钥密钥和盐循环迭代1000次从而实现加密,同理解密反向操作。

在.NET Core中实现AES加密和解密

在.NET Core中对于对称加密统一接口不再利用不同类而实现,对于非对称加密当然和对称加密接口就不同了,创建起来格外方便,不再是实例化对应的类,如下

            //对称加密var aes = Aes.Create();var tripleDES = TripleDES.Create();//非对称加密var rsa = RSA.Create();

由下可以看出直接定义了一个静态方法来创建加密

    public abstract class Aes : SymmetricAlgorithm{protected Aes();public override KeySizes[] LegalBlockSizes { get; }public override KeySizes[] LegalKeySizes { get; }public static Aes Create();}

    public abstract class RSA : AsymmetricAlgorithm{protected RSA();public static RSA Create();...}

当然命名空间依然是 System.Security.Cryptography 。我们直接看实现。

AES加密

        public static string AESEncrypt(string input, string key){var encryptKey = Encoding.UTF8.GetBytes(key);using (var aesAlg = Aes.Create()){using (var encryptor = aesAlg.CreateEncryptor(encryptKey, aesAlg.IV)){using (var msEncrypt = new MemoryStream()){using (var csEncrypt = new CryptoStream(msEncrypt, encryptor,CryptoStreamMode.Write))using (var swEncrypt = new StreamWriter(csEncrypt)){swEncrypt.Write(input);}var iv = aesAlg.IV;var decryptedContent = msEncrypt.ToArray();var result = new byte[iv.Length + decryptedContent.Length];Buffer.BlockCopy(iv, 0, result, 0, iv.Length);Buffer.BlockCopy(decryptedContent, 0, result,iv.Length, decryptedContent.Length);return Convert.ToBase64String(result);}}}}

AES解密

        public static string AESDecrypt(string input, string key){var fullCipher = Convert.FromBase64String(input);var iv = new byte[16];var cipher = new byte[16];Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length);Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, iv.Length);var decryptKey = Encoding.UTF8.GetBytes(key);using (var aesAlg = Aes.Create()){using (var decryptor = aesAlg.CreateDecryptor(decryptKey, iv)){string result;using (var msDecrypt = new MemoryStream(cipher)){using (var csDecrypt = new CryptoStream(msDecrypt,decryptor, CryptoStreamMode.Read)){using (var srDecrypt = new StreamReader(csDecrypt)){result = srDecrypt.ReadToEnd();}}}return result;}}}

测试如下:

            var key = Guid.NewGuid().ToString("N");var name = "Jeffcky";Console.WriteLine($"加密字符串为{name}");var encryptStr = AESEncrypt(name, key);Console.WriteLine($"加密后结果为:{encryptStr}");var decryptStr = AESDecrypt(encryptStr, key);Console.WriteLine($"解密后字符串为{decryptStr}");

总结

在.NET Core中实现对称加密和非对称加密无论是实现还是创建都更加简洁,之前也并未去具体了解加密和解密相关内容,借此机会稍微了解下对应的加密所以花了一点时间。对于AES加密还没怎么具体去了解内部原理,只是参照了一点资料,以此作为备忘录,目前.NET Core仅支持AES、TripleDES、RSA。希望对在.NET Core项目中需要实现加密的童鞋提供一点帮助。接下来有时间我们继续巩固下线程基础知识,敬请期待,待我学习完毕再来更新博客和大家一起分享。

转载于:https://www.cnblogs.com/CreateMyself/p/6771652.html

探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!相关推荐

  1. Java中的AES加密和解密(CBC模式)

    通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...

  2. javascript 解密_Javascript中的AES加密和Java中的解密

    javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...

  3. Javascript中的AES加密和Java中的解密

    AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本(例如密码)并将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台(例如Andr ...

  4. 探讨NET Core数据进行3DES加密或解密弱密钥问题

    [导读]之前写过一篇<探讨.NET Core数据进行3DES加密和解密问题>,最近看到有人提出弱密钥问题,换个强密钥不就完了吗,猜测可能是与第三方对接导致很无奈不能更换密钥,所以产生本文解 ...

  5. 探讨.NET Core数据进行3DES加密和解密问题

    前言 一直困扰着我关于数据加密这一块,24号晚上用了接近3个小时去完成一项任务,本以为立马能解决,但是为了保证数据的安全性,我们开始去对数据进行加密,然后接下来3个小时专门去研究加密这一块,然而用着用 ...

  6. 解密HLS中的AES加密

    解密HLS中的AES加密 主题 加密解密 如果m3u8文件中包含#EXT-X-KEY字段,那么可以断定这个HLS中的ts文件是被加密的,如: #EXTM3U#EXT-X-VERSION:3#EXT-X ...

  7. 使用as3crypto在Flex中实现AES加密

    要在Flex中实现AES加密,可以通过as3crypto实现.但是as3crypto本身的用法比较复杂,一般是封装一下再调用. 下面是9RIA上的一篇文章给出的一个实现,使用中稍感不方便(见注释): ...

  8. mysql aes_MYSQL AES加密与解密函数使用

    最近在做项目的时候,需要对一个数字串进行加密,但是加密密文又需要可以可以逆转,因此不能使用md5或sha之类的,只能用aes或des.翻了资料,尝试了在php层进行加密解密,用到了php的加密函数库, ...

  9. Php AES加密、解密与Java互操作的问题

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

最新文章

  1. 初识BGP外部网关协议(一)
  2. 什么叫做项目孵化_蓝莓孵化营12进5争夺战,项目人绽放自我不留遗憾
  3. Bitmap文件格式+生成一个BMP文件
  4. NET平台4.0 发布网站流程及出错总结
  5. centos8 安装nvidia 显卡驱动(一路踩坑一路填)
  6. AptitudeSystem 2.0
  7. 通用权限系统快速开发框架
  8. java springmvc 教程pdf_最全最经典spring_mvc教程.pdf
  9. opencv2,3 ,4几个版本的区别及冲突性,使用的时候用头文件注意
  10. CCF-CSP/202206-2—寻宝!大冒险!c++解题思路
  11. 一个软件完整的开发流程,不会程序也能自己制作手机App
  12. pyspark groupby分组 遍历分组后的数据(每一行)
  13. 蓝牙耳机无法与计算机连接,电脑连接蓝牙耳机时无法连接
  14. 英语背单词软件需求分析
  15. 【CSS】用CSS画太极图
  16. 结构化数据,半结构化数据,非结构化数据(区别)
  17. 火车头如何下载附件文件
  18. java设计一个形状shape_编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接......
  19. 对于算法工程师职业生涯规划的考虑
  20. 软件项目中的功能风险矩阵

热门文章

  1. 3.对角线遍历(LeetCode第498题)
  2. C++ 协程介绍[译]
  3. 服务器返回数据为空,iOS 处理服务器返回数据中的null
  4. java 封装 继承 堕胎_JAVA封装、继承、多态
  5. spring中怎么访问MySQL过程_【FunnyBear的Java之旅 - Spring篇】7步连接MySQL
  6. 图像的均值和方差python_python-绘制均值和标准差
  7. ansible自动化运维(三)——Playbook实战
  8. linux tomcat 安装教程,关于Linux下配置安装Tomcat8的步骤
  9. html body 间距,VBA&amp; HTMLBody - 正文和签名之间的间距
  10. elementui如何在input 框中搜索_在 Windows 10 中的文件资源管理器中删除搜索历史记录...