我的编程空间,编程开发者的网络收藏夹
学习永远不晚

各方面探讨NET Core数据加密和解密问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

各方面探讨NET Core数据加密和解密问题

     欢迎大家阅读本篇文章,本篇文章探讨NET Core数据加密和解密问题,编程学习网教育平台提醒大家:本篇文章中有许多的小细节,因此大家一定要认真阅读本篇文章哦~

     3DES数据加密

  由于数据需要获取出来并显示于是只能使用对称加密,关于加密这一块网上对于.NET Framework的实现数不胜数,好像对于.NET Core这一块比较少,于是就开始进行研究。这个时候就利用DES或者Triple DES也称作3DES,全名为Triple Data Encryption Algorithm (TDEA or Triple DEA),也就是对称密码块密码,3DES对数据的每个数据块利用算法进行3次加密,最初开始设计该算法时,位数只有56位也就是7个字节,设计者认为已经足够用,但是随着计算机的高速发展,暴露破解已经使得该算法呈现的问题日益突出,而3DES算法的出现提供了一种比较简单的方法来增加密钥的大小从而防止攻击,而不是重新设计一套全新的分组密码算法。

  3DES加密算法命名

  定义算法最早期的标准被放在ANS X9.52中并在1998年发布并将其描述为三重数据加密算法(简称TDEA),在ANSI X3.92中定义了该算法的三个操作但是并没有使用DES或者3DES,直到1999年发布的FIPS PUB 46-3在正式命名三重数据加密算法,大概在2004到2005的样子才正式引入三重数据加密算法,之前一直以TDEA存在着,也就是说TDEA就是3DES,但是没有使用3DES作为标准术语。

  3DES算法逻辑

  三重数据加密算法使用包括密钥K1,密钥K2和密钥约束K3,每一个包含56位不包含奇偶校验,算法实现公式如下:

  ciphertext = EK3(DK2(EK1(plaintext)))

  即

  密文 = EK3(DK2(EK1(平文)))

  用K1对数据进行加密,用K2对数据进行解密,用K3对数据再加密。

  解密公式为如下:

  plaintext = DK1(EK2(DK3(ciphertext)))

  即

  平文 = DK1(EK2(DK3(密文)))

  用K3j对数据进行解密,用K2对数据进行加密,用K1对数据进行加密。每次加密都处理64位数据并形成一块。

  3DES加密选项

  定义了三种密钥选项。

  (1)三个密钥相互独立。

  (2)K1和K2密钥独立,但K1 = K3。

  (3)三个密钥相等。

  密钥选项1的强度最高,拥有3 x 56 = 168个独立的密钥位。

  密钥选项2的安全性稍低,拥有2 x 56 = 112个独立的密钥位。该选项比简单的应用DES两次的强度较高,即使用K1和K2,因为它可以防御中途相遇攻击。

  密钥选项3等同与DES,只有56个密钥位。这个选项提供了与DES的兼容性,因为第1和第2次DES操作相互抵消了。该选项不再为国家标准科技协会(NIST)所推荐,亦不为ISO/IEC 18033-3所支持。

  利用3DES在.NET Framework中实现加密和解密

  我们看下在.NET Framework中对于3DES的具体实现,如下:

  public static string DesEncrypt(string input, string key)

  {

  byte[] inputArray = Encoding.UTF8.GetBytes(input);

  TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();

  tripleDES.Key = Encoding.UTF8.GetBytes(key);

  tripleDES.Mode = CipherMode.ECB;

  tripleDES.Padding = PaddingMode.PKCS7;

  ICryptoTransform cTransform = tripleDES.CreateEncryptor();

  byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);

  tripleDES.Clear();

  return Convert.ToBase64String(resultArray, 0, resultArray.Length);

  }

  public static string DesDecrypt(string input, string key)

  {

  byte[] inputArray = Convert.FromBase64String(input);

  TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();

  tripleDES.Key = Encoding.UTF8.GetBytes(key);

  tripleDES.Mode = CipherMode.ECB;

  tripleDES.Padding = PaddingMode.PKCS7;

  ICryptoTransform cTransform = tripleDES.CreateDecryptor();

  byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);

  tripleDES.Clear();

  return Encoding.UTF8.GetString(resultArray);

  }

  我们给出一个16位的加密密钥,然后对相应数据进行加密和解密

  var name = "Jeffcky";

  var encryptStr = DesEncrypt(name, "sblw-3hn8-sqoy19");

  Console.WriteLine(name);

  var decryptStr = DesDecrypt(encryptStr, "sblw-3hn8-sqoy19");

  Console.WriteLine(decryptStr);

各方面探讨NET Core数据加密和解密问题_ ASP_web_计算机_编程学习网教育

   利用3DES在.NET Framework中实现加密和解密

  我们定义密钥为16个字节,即此时应该是有两个密钥,但是此时密钥却不同,所以猜测内部实现的3DES密码选项中的第二项,因为密钥3和密钥1相等,既然没出错,内部应该会去拿密钥1中的位数作为密钥3的位数。接下里我们再来看在.NET Core中的情况。

  ASP.NET Core 中的数据保护

  web应用程序中经常需要存储一些敏感数据(如用户密码),Windows 系统为桌面程序提供了DPAPI用来使用,但是并不适用于 Web 系统。ASP.NET Core提供了一套简单易用的API 用来保护数据。

  ASP.NET Core 中,数据保护主要是用来给服务端设计的,用来替换ASP.NET 1.x-4.x中的,machineKey主要是用来保证使用Form身份验证时Cookie数据的加密解密,以确保不会被修改。或者ViewState数据的加密解密不被篡改,以及对session状态标识进行验证。

  先看一下最简单的使用方法:

  using System;

  using Microsoft.AspNetCore.DataProtection;

  using Microsoft.Extensions.DependencyInjection;

  public class Program

  {

  public static void Main(string[] args)

  {

  // 添加数据保护到服务中

  var serviceCollection = new ServiceCollection();

  serviceCollection.AddDataProtection();

  var services = serviceCollection.BuildServiceProvider();

  // 从DI中创建一个MyClass的实例

  var instance = ActivatorUtilities.CreateInstance(services);

  instance.RunSample();

  }

  public class MyClass

  {

  IDataProtector _protector;

  // 参数 'provider' 来自 DI

  public MyClass(IDataProtectionProvider provider)

  {

  _protector = provider.CreateProtector("Contoso.MyClass.v1");

  }

  public void RunSample()

  {

  Console.Write("Enter input: ");

  string input = Console.ReadLine();

  // 加密

  string protectedPayload = _protector.Protect(input);

  Console.WriteLine($"Protect returned: {protectedPayload}");

  // 解密

  string unprotectedPayload = _protector.Unprotect(protectedPayload);

  Console.WriteLine($"Unprotect returned: {unprotectedPayload}");

  }

  }

  }

  

  在CreateProtector("Contoso.MyClass.v1")中,参数“Contoso.MyClass.v1”可以理解为一个公钥,因为 ASP.NET Core Data Protection 是非对称加密(见前面介绍),所以系统中应该还有一个密钥,那么此处的密钥 ASP.NET Core 在系统内部帮你维护了。

  读到这里,有同学可能会问了,那系统中是如何帮我维护我的密钥的呢? 我们不妨先来做一个测试。

  首先,我在我的开发环境中,先把上面的程序中的解密部分代码注释掉,然后运行上面的程序,输入一个“Hello World!” ,得到了一个加密的字符串CfDJ8ICcgQwZZhlAlTZT...OdfH66i1PnGmpCR5e441xQ(略写)。

  然后我把同样的程序拷贝到另外一台开发环境的机器上,然后把上面的加密部分代码注释掉,使用第一步生成的CfDJ8ICcgQwZZhlAlTZT...OdfH66i1PnGmpCR5e441xQ来解密,注意这两步中我们都使用 "Contoso.MyClass.v1" 来做为公钥。

  利用3DES在.NET Core实现加密和解密

  由于在.NET Core中不存在 TripleDESCryptoServiceProvider 取而代之的是 TripleDES ,所以此时我们的代码需要稍作修改,如下:

      由于在.NET Core中不存在 TripleDESCryptoServiceProvider 取而代之的是 TripleDES ,所以此时我们的代码需要稍作修改,如下

  public static string DesEncrypt(string input, string key)

  {

  byte[] inputArray = Encoding.UTF8.GetBytes(input);

  var tripleDES = TripleDES.Create();

  var byteKey = Encoding.UTF8.GetBytes(key);

  tripleDES.Key = byteKey;

  tripleDES.Mode = CipherMode.ECB;

  tripleDES.Padding = PaddingMode.PKCS7;

  ICryptoTransform cTransform = tripleDES.CreateEncryptor();

  byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);

  return Convert.ToBase64String(resultArray, 0, resultArray.Length);

  }

  public static string DesDecrypt(string input, string key)

  {

  byte[] inputArray = Convert.FromBase64String(input);

  var tripleDES = TripleDES.Create();

  var byteKey = Encoding.UTF8.GetBytes(key);

  tripleDES.Key = byteKey;

  tripleDES.Mode = CipherMode.ECB;

  tripleDES.Padding = PaddingMode.PKCS7;

  ICryptoTransform cTransform = tripleDES.CreateDecryptor();

  byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);

  return Encoding.UTF8.GetString(resultArray);

  }

  由于在.NET Core中不存在 TripleDESCryptoServiceProvider 取而代之的是 TripleDES ,所以此时我们的代码需要稍作修改,如下

  接着进行调用:

  var name = "Jeffcky";

  var encryptStr = DesEncrypt(name, "sblw-3hn8-sqoy19");

  Console.WriteLine(name);

  var decryptStr = DesDecrypt(encryptStr, "sblw-3hn8-sqoy19");

  Console.WriteLine(decryptStr);

  由上说明我们给出密钥的大小对于3DES对称加密算法时无效的,为何呢,在.NET Framework是好使的呀,当我们调试时将鼠标放在3DES中密钥时你会发现它实际需要的字节为24个字节,而我们只提供了16个字节,

  结果出错了详细信息如下:

  System.Security.Cryptography.CryptographicException:“Specified key is not a valid size for this algorithm.”

  由上说明我们给出密钥的大小对于3DES对称加密算法时无效的,为何呢,在.NET Framework是好使的呀,当我们调试时将鼠标放在3DES中密钥时你会发现它实际需要的字节为24个字节,而我们只提供了16个字节,如下:

由上说明我们给出密钥的大小对于3DES对称加密算法时无效的,为何呢,在.NET Framework是好使的呀,当我们调试时将鼠标放在3DES中密钥时你会发现它实际需要的字节为24个字节,而我们只提供了16个字节,

  所以到这里我们应该知道问题出在什么地方了,根据我们对3DES的介绍内部实现的选项应该是密钥选项2,将密钥1和密钥2独立开来,而密钥3和密钥相同,在.NET Framework中我们只要两个密钥即可,因为第三个密钥和第一个相同,既然没出错肯定是内部重用了密钥1,但是在.NET Core需要我们给出24个字节,说明即使密钥1和密钥3相同也要我们提供密钥的字节,所以我们只要将密钥1中的八个字节拷贝到密钥3中,这样就有了24个字节,实现如下:

      说明即使密钥1和密钥3相同也要我们提供密钥的字节,所以我们只要将密钥1中的八个字节拷贝到密钥3中,这样就有了24个字节,实现如下

  public static string DesEncrypt(string input, string key)

  {

  byte[] inputArray = Encoding.UTF8.GetBytes(input);

  var tripleDES = TripleDES.Create();

  var byteKey = Encoding.UTF8.GetBytes(key);

  byte[] allKey = new byte[24];

  Buffer.BlockCopy(byteKey, 0, allKey, 0, 16);

  Buffer.BlockCopy(byteKey, 0, allKey, 16, 8);

  tripleDES.Key = allKey;

  tripleDES.Mode = CipherMode.ECB;

  tripleDES.Padding = PaddingMode.PKCS7;

  ICryptoTransform cTransform = tripleDES.CreateEncryptor();

  byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);

  return Convert.ToBase64String(resultArray, 0, resultArray.Length);

  }

  public static string DesDecrypt(string input, string key)

  {

  byte[] inputArray = Convert.FromBase64String(input);

  var tripleDES = TripleDES.Create();

  var byteKey = Encoding.UTF8.GetBytes(key);

  byte[] allKey = new byte[24];

  Buffer.BlockCopy(byteKey, 0, allKey, 0, 16);

  Buffer.BlockCopy(byteKey, 0, allKey, 16, 8);

  tripleDES.Key = allKey;

  tripleDES.Mode = CipherMode.ECB;

  tripleDES.Padding = PaddingMode.PKCS7;

  ICryptoTransform cTransform = tripleDES.CreateDecryptor();

  byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);

  return Encoding.UTF8.GetString(resultArray);

  }

  说明即使密钥1和密钥3相同也要我们提供密钥的字节,所以我们只要将密钥1中的八个字节拷贝到密钥3中,这样就有了24个字节,实现如下

  此时我们再来看下打印结果:

      说明即使密钥1和密钥3相同也要我们提供密钥的字节,所以我们只要将密钥1中的八个字节拷贝到密钥3中,这样就有了24个字节,实现如下

  var name = "Jeffcky";

  Console.WriteLine($"加密字符串为{name}");

  var encryptStr = DesEncrypt(name, "sblw-3hn8-sqoy19");

  Console.WriteLine($"加密后结果为:{encryptStr}");

  var decryptStr = DesDecrypt(encryptStr, "sblw-3hn8-sqoy19");

  Console.WriteLine($"解密后字符串为{decryptStr}");

    说明即使密钥1和密钥3相同也要我们提供密钥的字节,所以我们只要将密钥1中的八个字节拷贝到密钥3中,这样就有了24个字节,实现如下

 当时遇到这个问题我就处在崩溃的边缘,结果去查找了资料发现有人遇到过问题,然后就去了解下3DES基本原理就解决了问题。

  总结

  当时遇到这个问题我就处在崩溃的边缘,结果去查找了资料发现有人遇到过问题,然后就去了解下3DES基本原理就解决了问题。

  记住:在.NET Core中利用3DES加密和解密必须要给出3个密钥即24个字节即使密钥3和密钥1相等,它不会像.NET Framework中会重用密钥1中的位数。

     结束语:相信最后大家阅读完毕本篇文章,肯定学到了不少知识吧?其实大家私下还得多多自学,当然如果大家还想了解更多方面的详细内容的话呢,不妨关注编程学习网教育平台,在这里你肯定会有意想不到的收获的!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

各方面探讨NET Core数据加密和解密问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

各方面探讨NET Core数据加密和解密问题

由于数据需要获取出来并显示于是只能使用对称加密,关于加密这一块网上对于.NET Framework的实现数不胜数,好像对于.NET Core这一块比较少,于是就开始进行研究。这个时候就利用DES或者Triple DES也称作3DES,全名为Triple Data Encryption Algorithm (TDEA or Triple DEA),也就是对称密码块密码,3DES对数据的每个数据块利用算法进行3次加密,最初开始设计该算法时,位数只有56位也就是7个字节,设计者认为已经足够用。编程学习网教
各方面探讨NET Core数据加密和解密问题
2024-04-23

Apache James数据库存储用户信息的密码加密问题及解决方案

ApacheJames采用MD5、SHA-1、SHA-256、SSHA和SSHA-256等加密算法来保护用户信息密码。以散列值形式存储密码,而不是明文。最佳实践包括使用强密码、定期更改密码和启用双因素身份验证。解决方案包括升级加密算法、增加盐值长度、实施哈希迭代和使用密码管理器。遵循这些措施可提高ApacheJames中密码的安全性,防止未经授权的访问。
Apache James数据库存储用户信息的密码加密问题及解决方案
2024-04-02

windows远程桌面出现“这可能是由于CredSSP加密数据库修正问题”解决方法

今天在登录windows远程桌面的时候出现这可能是由于CredSSP加密数据库修正问题提示,特搜素一下解决方法,需要的朋友可以参考下
2022-12-25

编程热搜

  • Mysql分表查询海量数据和解决方案
    众所周知数据库的管理往往离不开各种的数据优化,而要想进行优化通常我们都是通过参数来完成优化的。那么到底这些参数有哪些呢?为此在本篇文章中编程学习网笔者就为大家简单介绍MySQL,以供大家参考参考,希望能帮助到大家。以上就是关于大数据的知识点了。喜欢的可以分享给你的朋友,也可以点赞噢~更多内容,就在编程学习网!
    Mysql分表查询海量数据和解决方案
  • 大数据的妙用及17年趋势
    2017年,支持大量结构化和非结构化数据的系统将继续增长。市场需要数据平台来帮助数据管理人员管理和保护大数据,同时允许最终用户进行数据分析。这些系统将逐步成熟,在企业内部的IT系统中更好地运行。所以,我们更要了解大数据!互联网普及使得网民的行为更加多元化,通过互联网产生的数据发展更加迅猛,更具代表性。互联网世界中的商品信息、社交媒体中的图片、文本信息以及视频网站的视频信息,互联网世界中的人与人交互信息、位置信息等,都已经成为大数据的最重要也是增长最快的来源。大家都了解到了吗!更多内容就在编程学习网哟
    大数据的妙用及17年趋势
  • 5G大数据时代空降来袭
    欢迎各位阅读本篇文章,本文主要讲了5G大数据时代。如今 5G 概念已不再陌生,按照行业认同的说法:2017年至2018年 5G 将在国内开始有序测试,2019年进行预商用。工信部之前已表示,中国将在2020年启动 5G 商用。编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    5G大数据时代空降来袭
  • es详解-原理-从图解构筑对es原理的初步认知
    在学习ElasticSearch原理时,我推荐你先通过官方博客中的一篇图解文章(虽然是基于2.x版本)来构筑对ES的初步认知(这种认识是体系上的快速认知)。ES详解 - 原理:从图解构筑对ES原理的初步认知前言图解ElasticSearch图解LuceneSegmentInverted IndexStored Fiel
    es详解-原理-从图解构筑对es原理的初步认知
  • elasticsearch-wrapperquery
    在工作中遇到ElasticSearch版本升级时出现Java High Level接口变更导致的兼容性问题: 之前使用的是2.4.x,考虑性能和功能的增强,需要更换为6.4.x; 2.4.x中我们使用DSL语句直接查询(数据的不确定性和方便动态建立查询规则等因素),而新的ES Java 高阶API中去掉了相关接口的支持
    elasticsearch-wrapperquery
  • 学习大数据营销思维(下)
    编程学习网: 其实,通过上面的介绍,我们知道苹果通过各类产品与服务销售相互促进以理及薄利多销的方式来盈利第二种战略联盟类型是合作方的共同赢利。苹果公司打造了一个参与方共同受益的业务系统。
    学习大数据营销思维(下)
  • 纯干货:HLS 协议详解及优化技术全面解析
    编程学习网:HLS (HTTP Live Streaming), 是由 Apple 公司实现的基于 HTTP 的媒体流传输协议。他跟 DASH 协议的原理非常类似,通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件给客户端,让客户端顺序地拉取这些媒体文件播放, 来实现看上去是在播放一条流的效果。HLS 目前广泛地应用于点播和直播领域。
    纯干货:HLS 协议详解及优化技术全面解析
  • 关于Python 代码全面分析
    欢迎各位阅读本篇,Python(KK 英语发音:/ˈpaɪθən/)是一种面向对象、直译式计算机程序设计语言。本篇文章讲述了关于Python 代码全面分析。
    关于Python 代码全面分析
  • es详解-原理-es原理之索引文档流程详解
    ElasticSearch中最重要原理是文档的索引和文档的读取,本文带你理解ES文档的索引过程。ES详解 - 原理:ES原理之索引文档流程详解文档索引步骤顺序单个文档多个文档文档索引过程详解整体的索引流程分步骤看数据持久化过程深入ElasticSearch索引文档的实现机制写操作的关键点Lucene的写Elastics
    es详解-原理-es原理之索引文档流程详解
  • 五大“网管”必备的网络数据分析工具
    是不是在为如何分析统计网络数据和流量烦恼呢?想不想监控、运维、排障轻松一些?下面给大家提供一些免费网络分析工具,以帮助大家更好的掌控自己的网络!编程学习网教育
    五大“网管”必备的网络数据分析工具

目录