DES加密算法在很多行业都有着非常广泛的应用,对于初学者,开始很容易被ECB、CBC以及计算MAC搞得困惑不已,下面我将一一介绍这几者之间的关系,希望对新人有帮助。为了易于表述,下面所有的密钥及数据都用16进制字符串表示(比如:0x12 0x34 0x56 0x78会被直接写成12345678)。另外,最好你手头上有DES计算工具,以便做一些演算,这样可以更好地学习本篇文章的内容。)

1. DES(单倍长)与3DES(双倍长)ECB加密

1.1 DES

SDES_Key=3DES_Key_Left8=9BED98891580C3B2

Input=F4F3E7B3566F6622  // D1

ECB加密的结果=5416B1A553743610  // O1

Input=098750B491EA8D5C  // D2

ECB加密的结果=48A9014362846BA2  //

Input=F4F3E7B3566F6622098750B491EA8D5C  // D1 || D2

ECB加密的结果=5416B1A55374361048A9014362846BA2  // O1 || O2

每一轮DES ECB加密都是把数据按8字节来分组,各个分组之间彼此独立

1.2 3DES(双倍长

3DES_Key=9BED98891580C3B245FE9EC58BFA8D2A  // 左边8字节的Key和SDES_Key一样

Input=F4F3E7B3566F6622098750B491EA8D5C

ECB加密的结果=FE7B6C8A73167964798EBAC2BA4899AA

看过PBOC规范中关于3DES ECB加密的描述,3DES和DES加密的差别在于3DES加密是在DES加密的结果基础上再用右边8字节的密钥解密,

然后再用左边8字节的密钥进行加密,得到的结果即最终密文数据。演算过程如下

3DES_Key_Left8=9BED98891580C3B2

3DES_Key_Right8=45FE9EC58BFA8D2A

(1)用3DES_Key_Left8(9BED98891580C3B2)对Input(F4F3E7B3566F6622098750B491EA8D5C)加密得到5416B1A55374361048A9014362846BA2;

(2)用3DES_Key_Right8(45FE9EC58BFA8D2A)对5416B1A55374361048A9014362846BA2解密得到685F98099C7D741B9A849E2C8DFFC430

(3)3DES_Key_Left8(9BED98891580C3B2)对685F98099C7D741B9A849E2C8DFFC430加密得到FE7B6C8A73167964798EBAC2BA4899AA。

是不是很简单?

2. ECB加密模式和CBC加密模式的差异

3DES_Key=9BED98891580C3B245FE9EC58BFA8D2A

IV=0000000000000000  // 初始向量,其作用是先与Input的前8字节做异或运算,得到的结果才被用于DES加密

Input=F4F3E7B3566F6622098750B491EA8D5C

ECB加密的结果=FE7B6C8A73167964798EBAC2BA4899AA

CBC加密的结果=FE7B6C8A731679649273F6368EAE9E98

ECB加密和CBC加密的结果是不是有点像?这里2者的结果差异是前8字节一样,后面的不一样,为什么?

因为对于CBC加密来说,其加密是链式的,后面的加密结果依赖于前面的结果

对于第一块待加密数据,其首先要和IV异或得到D1,D1作为真实的输入,对D1加密得到的结果记为O1;

对于第二块待加密数据,其首先要和O1异或得到D2,D2作为真实的输入,对D2加密得到的结果记为O2。

如果还有其他数据,类推,直到算出最终的结果。

我们来演算一下CBC的加密过程:

(1)IV(0000000000000000)和Input的第一块数据F4F3E7B3566F6622进行异或运算得到F4F3E7B3566F6622(因为IV是全0的缘故,第一块输入数据并没有改变!),记为D1。

(2)对D1进行ECB加密得到FE7B6C8A73167964,记为O1。

(3)O1和第二块输入数据进行异或运算得到F7FC3C3EE2FCF438,记为D2。

(4)对D2进行ECB加密得到9273F6368EAE9E98,

最终的CBC加密结果O1||O2,FE7B6C8A731679649273F6368EAE9E98。

所以从本质上讲,ECB、CBC只是在对输入数据的处理上有差异,对于底层的加密算法,实际上都是ECB加密模式。

3. MAC的真实面目

3.1 单倍长密钥计算MAC

对于单倍长密钥计算MAC,通常都是采用ANSI X9.9标准,其本质就是CBC加密,取最终的结果的最后8字节为MAC(有些规范再取其中的前4字节为MAC)。

SDES_Key=9BED98891580C3B2

IV=0000000000000000  // 初始向量,CBC加密运算需要

Input=F4F3E7B3566F6622098750B491EA8D5C6

CBC加密结果=5416B1A5537436105B6E2CAC0F87986F

取最后的8字节为MAC即:5B6E2CAC0F87986F

3.2 双倍长密钥计算MAC

PBOC规范中采用的双倍长MAC计算方法(与ISO 9797-1 MAC algorithm3 一致)是:

(1)用左边8字节的密钥对输入数据进行CBC加密,取密文的最后8字节,记为O1

(2)用右边8字节的密钥对O1进行ECB解密得到O2

(3)用左边8字节的密钥对O2进行ECB加密得到O3,O3即最终 MAC。

3DES_Key=9BED98891580C3B245FE9EC58BFA8D2A

IV=0000000000000000  // 初始向量,CBC加密运算需要

Input=F4F3E7B3566F6622098750B491EA8D5C$ K+ [6 z2 x3 c$ O

(1)用3DES_Key_Left8(9BED98891580C3B2)对Input(F4F3E7B3566F6622098750B491EA8D5C)CBC加密得到5416B1A5537436105B6E2CAC0F87986F,

去最后8字节5B6E2CAC0F87986F为O1;

(2)用3DES_Key_Right8(45FE9EC58BFA8D2A)对O1(5B6E2CAC0F87986F)ECB解密得到0C583C96DE7074B4,记为O2;

(3)3DES_Key_Left8(9BED98891580C3B2)对O2(0C583C96DE7074B4)ECB加密得到MAC(95FA419313B62BA4)

4. DES算法的校验位

DES算法每组密钥为8字节,64bits,实际上参与加/解密运算的只有56bits,因为密钥的每个字节的最低bit(bit 1)被设计成奇偶校验位,所以实际上你用密钥9AEC99881481C2B3替换本文上面的9BED98891580C3B2,这两个密钥的差异只是每个字节的最低bit不一样,但是你会发现所有的计算结果都是一样的。

结语,MAC算法本质上就是CBC加密算法,对于3DES MAC计算还需加上一点变化,而CBC加密本质上还是ECB加密。

java des 加密 单倍长_明明白白使用DES加密算法相关推荐

  1. java 双倍长密钥3des_用Java实现的单倍长密钥DES、双倍长密钥3DES和Mac计算

    package tools; import java.io.UnsupportedEncodingException; /** * @author liyan * */ public class DE ...

  2. des vue 双倍长 解密_[转]单倍长密钥加密和双倍长密钥加密,银联直联终端62域难点详解...

    首先来看一段文字: ------------------– 银联直联终端测试中,在POS终端签到的应答报文中,62域是如何规定的? 62域长度应为24或40个字节.对于单倍长密钥算法:前12个字节为P ...

  3. des算法密码多长_密码学中的多个DES

    des算法密码多长 This is a DES that was susceptible to attacks due to tremendous advances in computer hardw ...

  4. aes加密内容不定长_浅谈加密技术

    1.加密算法术语 假设我们将ABCD中的每个字母替换为其后的第二个字母,例如A替换为C,最终ABCD替换为CDEF. 明    文:ABCD 加密算法:字母替换 密    钥:每个字母替换为其后的第二 ...

  5. js des加密 java_Java实现与JS相同的Des加解密算法完整实例

    本文实例讲述了Java实现与JS相同的Des加解密算法.分享给大家供大家参考,具体如下: 这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码 一.java实现 package ...

  6. java文件加密解密实验报告_《网络信息安全技术》_实验报告_破译vigenamp#232;re_密码加密的密文...

    <<网络信息安全技术>_实验报告_破译vigen&amp#232;re_密码加密的密文>由会员分享,可在线阅读,更多相关<<网络信息安全技术>_实验报 ...

  7. java插入数据库字段过长_数据库插入数据长度过大,出现提示:将截断字符串或二进制数据...

    异常代码: org.hibernate.exception.GenericJDBCException: could not insert: [com.huama.equma.entity.DicPac ...

  8. java servlet是单例吗_关于java:为什么apache servlet是单例?

    本问题已经有最佳答案,请猛点这里访问. HttpServletRequest request; HttpServletResponse response; public void doGet(Http ...

  9. JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

    一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...

最新文章

  1. 在自己的网站添加关注新浪关注按钮
  2. 《Java8实战》-第六章读书笔记(用流收集数据-01)
  3. python读取邮件发送日期和时间_Python读取指定日期邮件的实例
  4. 第一讲 ODE几何方法
  5. mac下常用数据库及nginx笔记
  6. 交流磁路matlab,严格地说,交流磁路计算应该用磁滞回线。
  7. windows命令行大汇总
  8. 移动互联网“大开放”之死
  9. mysql 集群操作系统_mysql集群部署
  10. 纯php代码进行删除数据操作
  11. 矢量网络分析仪(矢网)组成和原理简介
  12. Excel催化剂100+大主题功能梳理导读
  13. 差错控制之检错编码与纠错编码
  14. 什么时候要抛出异常? !
  15. 轻松一下,做一道题目吧
  16. 红米2支持java吗_红米2a会有报错:java.lang.NullPointerException
  17. 51单片机实现8只LED左右来回点亮
  18. (4)复函数与拉普拉斯变换
  19. TFS30063 您没有权限
  20. Dubbo面试八股文—1

热门文章

  1. 教你怎样查询快递查询单号并保存物流信息
  2. 台式计算机没有声音图标,电脑突然没有声音怎么解决 电脑喇叭图标不见了怎么办...
  3. linux ln -s
  4. 今天, IG 帮我们圆梦
  5. 含有未知中间变量同时需要传递其他中间变量的微分方程参数拟合
  6. 【Android视频 之 阿里云视频播放器 二】
  7. sim卡与imei号和手机号码之间的关系
  8. 浮点变量(float, double等)和零值的比较
  9. Java Socket详解+基础模板+各种常见问题+端口映射
  10. LAMP(CentOS)环境详细配置步骤