PBOC/EMV之DES算法

转载请注明出处

作者:小马

 

Des是在金融电子领域用的比较多的一种加解密算法, 比如POS,ATM,智能IC卡等领域. 这个算法网上可以找到很多, 这篇文章只是自己整理一个版本,加入了一些自己的理解和注释.

 

关于什么是des算法以及历史由来等知识就不在这里废话了,直接入正题.

首先从一个高的层次理解des的原理.
Result = Des(data, key, mode);
把des看成一个函数, 它有三个入参:
1 data, 是要加密或解密的数据, 它是一个8字节的数据, 如果不是8字节,可以通过补位的方式,补成8字节的倍数.然后就可以分成多个数据段分别进行加密或解密.
2 key, 这个是用来加密或解密的密钥,它一定是一个8字节的数据. 
3 mode, 这个指示Des的工作模式,即加密或者解密
而函数返回的result就是最终加密或解密的结果,这的长度和data是一致的.

 

下面就可以深入剖析一下Des具体做什么了. 它有两个数据要处理,一个是data,一个是key.先来看看如何处理key

 

Key是一个8字节的密钥,在银行系统中,这个key一般由一个主密钥通过一个分散因子分散而来的. 可以表示如下:
Key=k1k2k3…k64
这个数据的第8, 16, 24, 32, 40, 48, 56, 64位(也就是每个字节的最高位)是用来做奇偶校验的,所以真正有效的密钥位数只有56位.我们把奇偶校验位去掉, 剩下56位,新的key表示成如下:
Key=k1k2k3…k56
然后,把key分成相等的两部分,A和B,即
A=k1k2…k28
B=k29k30..k56
接着把A,B中的位的位置分别换一下,换位的规则按照下面的表

也就是说,A的第一位换成原来输入的密钥的第57位, 第二位换成输入密钥的第49位等等,同理B也是.
最后的结果如下:
A=k57k49…k36
B=k65k55…k4
A和B的位数没变,还是28位

下面要做的操作是把A,B进行移位,循环左移,移动的位数按照下面的表格进行:

 

Des的密钥是经过16次迭代生成的一组16个密钥. 上面的表格i表示是第几次迭代,下面的数据表示该次迭代密钥循环左移的位数. 比如第1次迭代循环左移1位,第3次迭代循环左移2位等. 而第i次迭代用的输入数据是第i-1次迭代的结果. 如果用&(i)表示第i次循环左移操作,则可用如下的公式表示迭代操作:
第一次:
A(1)=&(1)A
B(1)=&(1)B
第i次:
A(i)=&(i-1)A
B(i)=&(i-1)B

现在假设第i次迭代后, 生成的A,B如下:
A(i)=A(i)1A(i)2….A(i)28
B(i)=B(i)1B(i)2….B(i)28

然后,把A,B合并, 即
C(i)=A(i)B(i), 显然,C(i)有56位, 然后按照下面的表格,取出这56位中的48个位重新得到一个Key(i).

 
也就是说生成的密钥key(i)的第1位,为原来C(i)的56位密钥的第14位,key(i)的第2位,是原来C(i)的56位密钥的第17位等,最终,生成一个48位的key(i)=k(i)1k(i)2….k(i)48.
因为一共有16次迭代, 所以共有key(0), key(1), key(2),….key(16), 16组key.

现在你知道了,最初传入的8字节(64位)的密钥最终会生成16个48位的密钥.先不理这些密钥怎么用, 下面自然会用到.

 

说完了key,该说说输入的数据了. 数据也是8字节的数据. 实际应用中,数据往往不会刚好是8字节,这时可以把数据补齐成8的倍数,然后分段加密.

假设输入数据表示成如下:
Data=d1d2d3….d64
首先把64个位的位置换一下, 换位的规则按照下面的表:

也就是说,新数据的第1位是原数据的第58位, 新数据的第2位是原数据的第50位,依次类推. 新生成的数据如下:
Data=d58d50d42….d7
为了方便继续下面的步骤,把上面的数据表示为:
changeData=d1d2d3….d64
把changeData分成相等的两部分,即left, right.
Left=d1d2…d32
Right=d33d34…d64

 

迭代标志:
下面的操作要进行迭代了,为了描述方便,前面加了一个迭代标志.
然后,left不变,把right由32位扩展为48位, 扩展的规则由下面的表格指定:

你可能奇怪为什么可以换一下位置怎么会由32位扩展到48位呢,其实可以看到表格里有一些数据是重复的,也就是说,48位的数据里有一些重复的. 新生成的right可表示如下:
Right=d32d1d2….d1
还记得前计算出的16组key吗, 把key(1)取出来,跟right异或, 得到一个新的right,表示成如下:
Right=r1r2r3…r48

 

接着要把这个48位的right还原成32位,也就是进行数据的压缩,压缩的步骤如下:
1 把right分成8部分,每部分6位,表示如下:
a=r1r2…r6
b=r7r8..r12
c=r13r14..r18
d=r19r20…r24
e=r25r26..r30
f=r31r32..r36
g=r37r38..r42
h=r43r44..r48

下面再给出8个表格:

 


上面这8个表格,分别对应a~h, 注意a~h都是6位,表示成整数范围为0~63, 所以把它们换成整数都能在上面各自对应的表格中找到一个4位的值. 举个例子:
a=57, 在表1中找到57对应的位置是0x3, 则a=0x3.
经过这样变换后,a~h都从原来的6位变为4位,再把它们拼起来,生成一个32的数,表示为
Right=r1r2…r32
再把这个32位的数,各个位换一下位置,换位的规则按照下面的表格:

 

也就是新数据的第1位为原数据的16位,依次类推. 新生成的数据为:
Right=r16r7…r25
然后,把这个right和left异或,结果给right, right原来的值给left. 这样得到一对新的left和right.

 

还记得前面的<迭代标志>吗,用新计算的left和right重新回到<迭代标志>,做同样的操作,一共迭代16次, 每一次都是用前一次得到的left和right, 但要记得中间有一步要用到key(i)做异或, 这个i就是迭代的次数.
假设第16迭代后,得到的分别是left(16), right(16), 则新的数据为
Data=right(16)left(16), 注意这里不是left(16)right(16).
新的data是一个64位的数, 按照下面的表格,调整一下各个位的位置, 

Data=d40d8…d25.
这个data就是加密后的数据。

 

最后说一下如何解密,des是一种对称的加密算法,也就是加密,解密是同一人密钥, 算法也相同,唯一不同的就是, 在数据迭代时,第一次用key(16),第二次用key(15),依次类推,一直到key(1).

 

另外,现在有一些des算法的变种,也比较流行,典型的一个就是3des.它的原理可以简单描述如下:
有三个56位长度的密钥(8字节), 分别为key1, key2, key3.
第一步,用key1对数据加密.
第二步,用key2解密.
第三步, 用key3加密

三个key如果不相等, 相当于密钥长度是168位,这样就更加安全.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用和引用的内容,RSA PBOC工具是一种用于银行卡的密码算法工具,主要用于密钥生成、公私钥加密解密以及联机交易验证和脱机数据验证等功能。在银行卡的应用中,RSA算法用于脱机数据验证,而PBOC标准则是指中国的银行卡标准,其中包括PBOC1.0和PBOC2.0标准,分别支持使用3DES算法的MAC、数据加解密和密钥离散算法。国密算法是用于PBOC3.0标准的增强安全部分的内容。根据引用的描述,该工具在智能卡、USB Key、POS等产品中发挥重要作用,并适用于需要基于命令行测试的嵌入式产品。如果您有更多疑问,可以咨询引用中提供的联系方式。123 #### 引用[.reference_title] - *1* *3* [银行卡安全密码算法辅助计算工具(3DES+RSA)](https://blog.csdn.net/goldboar/article/details/39254663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [PowerScript--功能强大的智能卡,USB Key, POS脚本命令工具](https://blog.csdn.net/l_z_h/article/details/124048086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值