前言

一直困扰着我关于数据加密这一块,24号晚上用了接近3个小时去完成一项任务,本以为立马能解决,但是为了保证数据的安全性,我们开始去对数据进行加密,然后接下来3个小时专门去研究加密这一块,然而用着用着却发现了一点问题,于是下班回来到写这篇博客到深夜才正式解决,请往下看。

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

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

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

由于在.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);}

接着进行调用:

            var name = "Jeffcky";var encryptStr = DesEncrypt(name, "sblw-3hn8-sqoy19");Console.WriteLine(name);var decryptStr = DesDecrypt(encryptStr, "sblw-3hn8-sqoy19");Console.WriteLine(decryptStr);

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

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

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

所以到这里我们应该知道问题出在什么地方了,根据我们对3DES的介绍内部实现的选项应该是密钥选项2,将密钥1和密钥2独立开来,而密钥3和密钥相同,在.NET Framework中我们只要两个密钥即可,因为第三个密钥和第一个相同,既然没出错肯定是内部重用了密钥1,但是在.NET Core需要我们给出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);}

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

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

总结

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

本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/6759996.html,如需转载请自行联系原作者

探讨.NET Core数据进行3DES加密和解密问题相关推荐

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

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

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

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

  3. 3DES加密、解密工具类

    一个简单的3DES加密.解密工具类,Base64在 sun.misc.BASE64Decoder替代类有介绍 package com.w; import java.security.Key; impo ...

  4. 前端 Vue 请求数据使用 3DES 加密/解密

    一.目的 最近工作中,前端联调后端接口请求的数据是 JSON 格式的明文,考虑到安全问题,与后端同事沟通协调后,规定前端采用 3DES 对请求数据加密,后端接收到请求后再用 3DES 进行解密. 二. ...

  5. 3des加密 java php_java的3DES加密PHP7解密备忘录

    前言: 有一个项目需要跟甲方做接口,甲方使用的是java的3DES加密解密方式. 甲方加密解密部分截图代码: 填写图片摘要(选填) 第一步: 将甲方的iv转成PHP可以使用的偏移量 填写图片摘要(选填 ...

  6. DES/3DES加密,解密

    〇.前言 最近在项目中,涉及到与第三方厂家系统进行对接时,在参数传递过程中考虑到了数据的安全性,故双方采用3DES进行对传递参数的加解密,因此,进一步了解了下3DES的加解密算法,再次进行梳理. 一. ...

  7. js的3DES加密与解密

    3DES的加密与解密 Base64与Hex Base64与Hex都属于编码形式,Hex又称Base16.在3DES的加密与解密过程中,需要进行两种编码形式的转换. 3DES的加密 首先first.ht ...

  8. 用C语言写一个 将从终端上接收到的8个一字节数据用3des加密之后再连接上随机生成的八个一字节的数据再发送给终端...

    以下是一种使用 C 语言实现上述要求的代码示例: #include <stdio.h> #include <openssl/des.h> #include <time.h ...

  9. 加密系列 | 3DES加密和解密算法详解代码示例

    3DES的在Java的实现与DES类似,如下代码为3DES加密算法.CBC模式.PKCS5Padding填充方式的加密解密结果,参考代码如下所示: import java.security.Key;i ...

最新文章

  1. linux samba 空目录,linux Samba搭建
  2. linux trap命令
  3. CommonJs模块规范
  4. pytorch 查看当前学习率_pytorch调整模型训练的学习率
  5. matlab cdf,Matlab 简单计算PDF和CDF | 学步园
  6. 平衡二叉查找树插入节点操作( AVLTree ):旋转、调整平衡
  7. MACIOS Socket编程
  8. 12款Javascript表格控件(DataGrid)
  9. Swagger生成WebAPI文档
  10. 吃热狗游戏Java_(转)Java中正确理解Thread Local的原理与适用场景
  11. ubuntu16.04.3下安装NVIDIAgtx1060显卡驱动记录
  12. VB中的“msgbox”函数各参数详解
  13. 第一章 银联8583报文解析
  14. HTML第6章上机练习3(制作京东快报页面)
  15. AndroidStudio 高频使用快捷键及使用技巧(gif图)
  16. 最近整理的一些常见的面试题,面试大全,黑马程序员面试宝典题库---最新技术--篇
  17. FC总线基础知识(2)——光纤交换机
  18. python io
  19. 圣诞的荒诞小故事并记录互联网协议-五层模型
  20. 终于等到你 -- 北京理工大学考研复试小记

热门文章

  1. mysql平台workb_MySQL 总结
  2. java 正则 实例_Java正则表达式实例详解
  3. 3项目里面全局用less变量 cli vue_vue-cli3 如何全局引入less变量
  4. crontab -e 运行python的脚本的坑
  5. java线程泄露_面试官:小伙子先来说一下可能引起Java内存泄露的场景吧
  6. 转载-如何做好项目的需求与业务调研
  7. Python 内置方法和属性应用:反射和单例
  8. ZedGraph怎样在双击图形后添加箭头标记
  9. FastReport的模板文件frx文件啊怎样打开并编辑修改
  10. Winform中设置ZedGraph因设置小刻度导致的竖直虚线显示过多