DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。一般密码长度为8个字节,其中56位加密密钥,每个第8位都用作奇偶校验。

DES算法一般有两个关键点,第一个是加密模式,第二个是数据补位,加密模式的主要意义就是,加密算法是按块进行加密的,例如 DES ,是 64Bit 一个块的进行加密,就是每次加密 8 个字节,因此每次输入八个字节的明文输出八个字节密文,如果是 16 个字节,那么分成两个块依次进行加密,问题就出现在这里,如果明文是 1234567812345678,分块分别进行加密,那么加密的结果类似“C4132737962C519C C4132737962C519C”,可以看出明文的规律,这就是 ECB 加密模式,密文可以看出明文的规律;为了解决这个问题,有了其他的加密模式:CBC 加密模式(密码分组连接),CFB加密模式(密码反馈模式),OFB加密模式(输出反馈模式)CBC 是要求给一个初始化的向量,然后将每个输出与该向量作运算,并将运算的结果作为下一个加密块的初始化向量,CFB 和 OFB 则不需要提供初始化向量,直接将密码或者输出作为初始化向量进行运算;这样就避免了明文的规律出现在密文中;当然缺点是解密时需要保证密文的正确性,如果网络传输时发生了一部分错误,则后面的解密结果就可能是错误的;(ECB模式仅影响传输错误的那个块。密码算法基本上都是分组(按快)进行加密的,如果密文长度不是刚刚好可以进行分组,怎么办?只能进行填充。

加密算法常见的有ECB模式和CBC模式:
第一种电子密本方式(ECB) 
      ECB模式:电子密本方式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节(注意:这里就涉及到数据补位了)进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。将明文分成n个64比特分组,如果明文长度不是64比特的倍数,则在明文末尾填充适当数目的规定符号。对明文组用给定的密钥分别进行加密,行密文C=(C0,C1,……,Cn-1)其中Ci=DES(K,xi),i=0,1,…..,n-1。 这是Java封装的DES算法的默认模式.
第二种密文分组链接方式(CBC)

密文分组链接方式,在CBC方式下,每个明文组xi在加密前与先一组密文按位模二加后,再送到DES加密,CBC方式克服了ECB方式报内组重的缺点,但由于明文组加密前与一组密文有关,因此前一组密文的错误会传播到下一组。 这是.NET封装的DES算法的默认模式,它比较麻烦,加密步骤如下:

1、首先将数据按照8个字节一组进行分组得到D1D2……Dn(若数据不是8的整数倍,就涉及到数据补位了)

2、第一组数据D1与向量I异或后的结果进行DES加密得到第一组密文C1(注意:这里有向量I的说法,ECB模式下没有使用向量I)

3、第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2

4、之后的数据以此类推,得到Cn

5、按顺序连为C1C2C3……Cn即为加密结果。

第三种密文反馈方式(CFB),可用于序列密码
   明文X=(x0,x1,……,xn-1),其中xi由t个比特组成0   第四种输出反馈方式(OFB),可用于序列密码
   与CFB唯一不同的是OFB是直接取DES输出的t个比特,而不是取密文的t个比特,其余都与CFB相同。但它取的是DES的输出,所以它克服了CFB的密文错误传播的缺点

数据补位一般有NoPadding和PKCS7Padding(Java中是PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding实际只是协议不一样,根据相关资料说明:PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。但是封装的DES算法默认都是8字节,所以可以认为他们一样。数据补位实际是在数据不满8字节的倍数,才补充到8字节的倍数的填充过程。

NoPadding填充方式:算法本身不填充,比如.NET的padding提供了有None,Zeros方式,分别为不填充和填充0的方式。

PKCS7Padding(PKCS5Padding)填充方式:为.NET和Java的默认填充方式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;如果r等于0,则补8个字节8.比如:

加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888.

.NET中的DES加密

对于.NET,框架在System.Security.Cryptography命名空间下提供了DESCryptoServiceProvider作为System.Security.Cryptography.DES加密解密的包装接口,它提供了如下的4个方法:

public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)

public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)

public override void GenerateIV()

public override void GenerateKey()

从.NET类库封装情况,加解密需要传入一个Key和IV向量。而且Key必须为8字节的数据,否则会直接抛异常出来,当使用ECB模式下,不管传入什么IV向量,加密结果都一样。

各大语言互操作解决方案:

  • C与C#通讯加密之C语言DES的cbc pkcs7的实现
  • C与C#通讯加密之C语言DES的cbc pkcs7的实现(二)
  • python和c#通用一致的des加密采用CBC和PKCS7
  • php实现3DES加密算法,工作模式CBC,填充模式PKCS7 Padding
  • 用 Java 解密 C# 加密的数据(DES)
  • Applied Crypto++: Block Ciphers

.NET中的DES对称加密相关推荐

  1. Java和.NET使用DES对称加密的区别

    Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...

  2. 古典密码学、DES对称加密、3DES对称加密知识总结和实验

    实验三.古典密码学.DES对称加密.3DES对称加密 一.古典密码学:当铺密码.培根密码.摩斯密码.键盘密码.与佛论禅 1.当铺密码: 解密"由人俱一口中"和"大中口由人 ...

  3. .NET中的密码学--对称加密

    作者:未知 介绍 在.NET之前,使用非托管的Win32APIs加密解密数据是一件非常痛苦的事情.为了这个加密解密的目的,.NET配置了一组类(和命名空间).现在你有很多类可以使用每种不同的算法保护你 ...

  4. java des对称加密_JAVA加密解密DES对称加密算法

    1 下面用DES对称加密算法(设定一个密钥,然后对所有的数据进行加密)来简单举个例子.2 3 首先,生成一个密钥KEY.4 我把它保存到key.txt中.这个文件就象是一把钥匙.谁拥有它,谁就能解开我 ...

  5. pyDes 实现 Python 版的 DES 对称加密/解密--转

    https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...

  6. DES对称加密(1)算法说明

    DES数据加密标准(Data Encryption Standard) 又称作DEA(Data Encryption Algorithm) , 它由霍斯特·费斯妥Horst Feistel设计,又名 ...

  7. Android+Java中使用Aes对称加密的工具类与使用

    场景 Android+Java中使用RSA加密实现接口调用时的校验功能: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11146 ...

  8. 密码学课程设计之DES对称加密

    前言 最近在进行密码学课程设计, 感觉拿python进行设计会显得比较简洁易懂,本人python比较渣渣,所以就拿出来练一练.用零零碎碎的时间写了五六天才把主干部分写完,真是菜哭我自己了.在此还需要感 ...

  9. des 对称加密 php,DES对称加密

    在ECB模式(electronic codebook mode)中不需要IV,但是也因此会出现相同明文的区块会产生相同密文而很容易被找到规律.所以不安全. DES是标准的对称加密算法,算法采用的密钥长 ...

最新文章

  1. 清华自动驾驶前沿报告!解密六大关键技术,全球人才分布【附下载】| 智东西内参...
  2. 数据结构与算法系列 目录
  3. HDU4353(找一个三角形面积与它里面包含点的比值最小)
  4. 使用document.ElementByTagName获取input元素并添加事件
  5. python 装饰器有哪些_Python装饰器有哪些常见用途?
  6. .NET6之MiniAPI(十一):本地化
  7. 《软件需求分析(第二版)》第 3 章——需求工程的推荐方法 重点部分总结
  8. nyoj 600——花儿朵朵——【离散化、线段树插线问点】
  9. mybatis整合Redis和ehcache实现二级缓存
  10. 数据挖掘--风电机组异常数据识别与清洗
  11. Linux清理入侵痕迹
  12. 计算机网络:应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言
  13. 线极化波的matlab仿真过程,基于MATLAB的电磁波极化波仿真教学
  14. 网传学习通1.7亿密码泄露:有什么补救措施?
  15. vue项目中运行项目造成浏览器崩溃
  16. 软件测试常用linux命令
  17. @mentions for Users with ActionText; 使用Tribute.js库
  18. 计算机管理恢复分区,如何在Windows中擦除恢复分区 | MOS86
  19. 电商平台“二选一” 最后买单的却是商家和消费者
  20. VC++MFC应用程序向导

热门文章

  1. STM32工作笔记0057---外部中断实验
  2. STM32工作笔记0043---什么是漏源电压,栅源电压
  3. 数据那点事001---集合
  4. el 表达式 可以解析的数据类型
  5. wps二次开发无法创建对象wps.application的解决方案
  6. C++——模板特化和偏特化
  7. java碰到乱码如何解决方法_如何处理java的乱码
  8. php基本语法实验总结,PHP总结(一)基本语法内容
  9. python实现logistic_用python实现Logistic
  10. 一步一步写算法(之排序二叉树插入)