前言

有幸接触了一下传说中的对称加密算法3DES

感觉这些加密算法与我的工作是想去甚远的,一般没什么机会接触这些东西

今次了解了一下3DES这个对称算法

原理算不上明白,算是踩了C#中的一些坑吧

C#中对于密钥的处理比较奇怪,花费了一晚上一早上的时间才弄明白

期间偷窥了不少C#的源代码

下面由我娓娓道来

简介

3DES算法命名

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

C#实现

讲真简介里用来凑字数的这些内容我其实没怎么看明白

C#中使用TripleDESCryptoServiceProvider类来实现相关功能

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

从下面源码中看出,该类接收的Key为16位或24位

然后对于这个Key,C#似乎有自己的处理方式

以下为个人理解:

这个24位的key会被处理成3个8字节的独立密钥参与运算

当提供24位key时并没有什么不妥

但是当提供16位的key时 会把提供的key拆分成两个块(block) 并以第一个块作为第三个块组成一个24位的密钥

如下:

输入密钥:49, 50, 51, 52, 53, 54, 55, 56, 57, 49, 50, 51, 52, 53, 54, 55实际使用:49, 50, 51, 52, 53, 54, 55, 56, 57, 49, 50, 51, 52, 53, 54, 55, 49, 50, 51, 52, 53, 54, 55, 56

可以看出使用了前8位来进行后面8位的补全

这时候你可能要问,如果提供一个不是16位也不是24位的密钥时会发生什么

会抛异常

以上理解都是在.NetFramework中的体现

如果换到NetCore中,效果就又不一样了

NetCore

在NetCore中不存在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);}

NetCore中同样要求我们提供24位的Key

但是不在兼容16位的Key,如果你提供一个非24位的Key就会异常

不过没关系,对于16位的Key我们可以自行处理一下

同理使用前8位补全后8位

        public static string DesEncrypt(string input, string key){byte[] inputArray = Encoding.UTF8.GetBytes(input);var tripleDES = TripleDES.Create();var byteKey = Encoding.UTF8.GetBytes(key);//复制前8位补全后8位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);//复制前8位补全后8位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);}

至此就可以正常兼容NetFramework的代码了

小结

至此写下此文,也算是对3DES有了些许了解吧

需要记住

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

转载于:https://www.cnblogs.com/ixysy/p/11057807.html

对称加密算法在C#中的踩坑日常相关推荐

  1. 让你在 API 设计中少踩坑的实战分享

    本文来自作者 奔跑吧架构师 在 GitChat 上分享 「让你在 API 设计中少踩坑的实战分享」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 在项目开发中,实际的编码只占用了整个项目不 ...

  2. Pytorch中Dataloader踩坑:RuntimeError: DataLoader worker (pid(s) 6700, 10620) exited unexpectedly

    Pytorch中Dataloader踩坑 环境: 问题背景: 观察报错信息进行分析 根据分析进行修改尝试 总结 环境: 系统:windows10 Pytorch版本:1.5.1+cu101 问题背景: ...

  3. 踩坑日常_MinGW-w64安装教程及踩坑记录

    踩坑日常_MinGW-w64安装教程及踩坑记录 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器.Gcc编译器能将C.C++语言源程序.汇程式化序 ...

  4. (非)对称加密算法在https中的应用(加密过程以及CA颁发、验证)

    文章目录 一.(非)对称加密 对称加密 非对称加密 二.http与https 1. HTTP 1.1 HTTP与TCP 1.2 短/长连接(HTTP如何使用TCP) 2. HTTPS = HTTP+S ...

  5. 微信退款 java工具类,微信支付中退款踩坑记录

    首先附上微信支付的开发者文档 其实这里所说的踩坑记录,无非就是微信在开发者文档上的写不太明确,也没有比较官方的demo,在此列出一个可行的demo,供大家下载使用. 主要问题就是在这几步解密上 微信的 ...

  6. html2canvas跨域踩坑日常

    这两天接到公司的指令做海报图分享 然后尝试使用html2canvas+uview+uniapp进行编写 踩坑如下 html2canvas跨域问题 我司使用的是oss云存储,起初发生跨域以为是本地原因导 ...

  7. 记录某项目中的踩坑与解决(持续更新)

    前言 最近参加了某个比赛, 我所选的赛题就是个类似知乎这样的安卓app,由于着手近一个月了,踩了不少坑,之前没怎么记录,估计事后也会忘记干净. 因此特开一帖,在此记录下相关的坑. 记录 Recycle ...

  8. python调用imblearn中SMOTE踩坑

      SMOTE是用来解决样本种类不均衡,专门用来过采样化的一种方法.第一次接触,踩了一些坑,写这篇记录一下: 问题一:SMOTE包下载及调用 # 包下载 pip install imblearn# 调 ...

  9. 安装KeOps过程中的踩坑记录

    由于需要跑一篇论文的代码,需要安装KeOps.这里忍不住再吐槽一次:Python开发环境的版本依赖管理太混乱了,加上各种操作系统,驱动,CUDA版本等等,太浪费生命.所以,如果要写论文,发布open ...

最新文章

  1. 搭建Ubuntu18.04+Anaconda3.x+Pycharm+SimpleITK(三)
  2. python3入门书籍-Python学习路上不可或缺的3本书籍【经验分享】
  3. 剑指Offer_17_树的子结构
  4. 电脑没有ps怎么改照片dpi_PS入门的小技巧来啦!小白们还在等什么呢?快进来啊!...
  5. Ext JS 5初探(二) ——Bootstrap.js
  6. 我今年89岁,刚刚拿了个物理学博士学位
  7. 图文详解教你在线换系统(无须U盘)
  8. 机器学习基础---回归方法---支持向量回归(SVR)
  9. linux系统查看网卡对应PCI地址
  10. C语言打印杨辉三角的多种方法
  11. 大数据时代是什么意思?大数据是什么?
  12. ABR与ASBR是什么?区别又是什么?
  13. 2017.11.15作业
  14. 【基本面的量化分析与投资的回报可能 - 上篇】
  15. php后端开发主要会哪些技术?
  16. 斐波那契数列前20项及和
  17. 暑期实训心得及总结_史国旭
  18. 微软Win11 Dev/Beta预览版22581.1(ni_release)发布
  19. Win之Software Installation:谷歌地球(Google Earth) 的简介、安装、使用方法之详细攻略
  20. MEPR系列全页式多功能证件|电子护照阅读器功能与选型注意事项

热门文章

  1. php 正则匹配 文件,php – 正则表达式匹配.htaccess中的一系列文件类型
  2. matlab相位相关图像配准,数字图像处理,相位相关图像配准
  3. z17mini android 8,努比亚Z17mini和荣耀8哪个好?努比亚Z17mini与华为荣耀8全面区别对比评测...
  4. asp跟JAVA语言有关系吗_asp程序员如何转行为J2EE之java基础上(11)
  5. map python2 python3 兼容,Python2与Python3兼容
  6. c语言 不显示dos窗口,运行DOS批处理不显示DOS窗口的方法
  7. java内存溢出模拟_模拟实战排查堆内存溢出(java.lang.OutOfMemoryError: Java heap space)问题...
  8. 使用Java FXGL构建太空游侠游戏
  9. 在R中创建晶须和盒图
  10. java 对象深度复制_Java深度复制– Java复制对象