对称加密算法在C#中的踩坑日常
前言
有幸接触了一下传说中的对称加密算法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#中的踩坑日常相关推荐
- 让你在 API 设计中少踩坑的实战分享
本文来自作者 奔跑吧架构师 在 GitChat 上分享 「让你在 API 设计中少踩坑的实战分享」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 在项目开发中,实际的编码只占用了整个项目不 ...
- Pytorch中Dataloader踩坑:RuntimeError: DataLoader worker (pid(s) 6700, 10620) exited unexpectedly
Pytorch中Dataloader踩坑 环境: 问题背景: 观察报错信息进行分析 根据分析进行修改尝试 总结 环境: 系统:windows10 Pytorch版本:1.5.1+cu101 问题背景: ...
- 踩坑日常_MinGW-w64安装教程及踩坑记录
踩坑日常_MinGW-w64安装教程及踩坑记录 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器.Gcc编译器能将C.C++语言源程序.汇程式化序 ...
- (非)对称加密算法在https中的应用(加密过程以及CA颁发、验证)
文章目录 一.(非)对称加密 对称加密 非对称加密 二.http与https 1. HTTP 1.1 HTTP与TCP 1.2 短/长连接(HTTP如何使用TCP) 2. HTTPS = HTTP+S ...
- 微信退款 java工具类,微信支付中退款踩坑记录
首先附上微信支付的开发者文档 其实这里所说的踩坑记录,无非就是微信在开发者文档上的写不太明确,也没有比较官方的demo,在此列出一个可行的demo,供大家下载使用. 主要问题就是在这几步解密上 微信的 ...
- html2canvas跨域踩坑日常
这两天接到公司的指令做海报图分享 然后尝试使用html2canvas+uview+uniapp进行编写 踩坑如下 html2canvas跨域问题 我司使用的是oss云存储,起初发生跨域以为是本地原因导 ...
- 记录某项目中的踩坑与解决(持续更新)
前言 最近参加了某个比赛, 我所选的赛题就是个类似知乎这样的安卓app,由于着手近一个月了,踩了不少坑,之前没怎么记录,估计事后也会忘记干净. 因此特开一帖,在此记录下相关的坑. 记录 Recycle ...
- python调用imblearn中SMOTE踩坑
SMOTE是用来解决样本种类不均衡,专门用来过采样化的一种方法.第一次接触,踩了一些坑,写这篇记录一下: 问题一:SMOTE包下载及调用 # 包下载 pip install imblearn# 调 ...
- 安装KeOps过程中的踩坑记录
由于需要跑一篇论文的代码,需要安装KeOps.这里忍不住再吐槽一次:Python开发环境的版本依赖管理太混乱了,加上各种操作系统,驱动,CUDA版本等等,太浪费生命.所以,如果要写论文,发布open ...
最新文章
- 搭建Ubuntu18.04+Anaconda3.x+Pycharm+SimpleITK(三)
- python3入门书籍-Python学习路上不可或缺的3本书籍【经验分享】
- 剑指Offer_17_树的子结构
- 电脑没有ps怎么改照片dpi_PS入门的小技巧来啦!小白们还在等什么呢?快进来啊!...
- Ext JS 5初探(二) ——Bootstrap.js
- 我今年89岁,刚刚拿了个物理学博士学位
- 图文详解教你在线换系统(无须U盘)
- 机器学习基础---回归方法---支持向量回归(SVR)
- linux系统查看网卡对应PCI地址
- C语言打印杨辉三角的多种方法
- 大数据时代是什么意思?大数据是什么?
- ABR与ASBR是什么?区别又是什么?
- 2017.11.15作业
- 【基本面的量化分析与投资的回报可能 - 上篇】
- php后端开发主要会哪些技术?
- 斐波那契数列前20项及和
- 暑期实训心得及总结_史国旭
- 微软Win11 Dev/Beta预览版22581.1(ni_release)发布
- Win之Software Installation:谷歌地球(Google Earth) 的简介、安装、使用方法之详细攻略
- MEPR系列全页式多功能证件|电子护照阅读器功能与选型注意事项
热门文章
- php 正则匹配 文件,php – 正则表达式匹配.htaccess中的一系列文件类型
- matlab相位相关图像配准,数字图像处理,相位相关图像配准
- z17mini android 8,努比亚Z17mini和荣耀8哪个好?努比亚Z17mini与华为荣耀8全面区别对比评测...
- asp跟JAVA语言有关系吗_asp程序员如何转行为J2EE之java基础上(11)
- map python2 python3 兼容,Python2与Python3兼容
- c语言 不显示dos窗口,运行DOS批处理不显示DOS窗口的方法
- java内存溢出模拟_模拟实战排查堆内存溢出(java.lang.OutOfMemoryError: Java heap space)问题...
- 使用Java FXGL构建太空游侠游戏
- 在R中创建晶须和盒图
- java 对象深度复制_Java深度复制– Java复制对象