DES、3 DES加密算法原理及其去语言实现

  

DES加密算法,为对称加密算法中的一种2年代初由IBM研发,后1977年被美国国家标准局采纳为数据加密标准,即DES全称的由来:数据加密标准。对称加密算法,是相对于非对称加密算法而言的。两者区别在于,对称加密在加密和解密时使用同一密钥,而非对称加密在加密和解密时使用不同的密钥,即公钥和私钥。常见的DES、3 DES、AES均为对称加密算法,而RSA,椭圆曲线加密算法,均为非对称加密算法。
?DES是
以64比特的明文为一个单位来进行加密的,超过64比特的数据,要求按固定的64比特的大小分组,分组有很多模式,后续单独总结,暂时先介绍DES加密算法.DES使用的密钥长度为64比特,但由于每隔7个比特设置一个奇偶校验位,因此其密钥长度实际为56比特。奇偶校验为最简单的错误检测码,即根据一组二进制代码中1的个数是奇数或偶数来检测错误。
?

  

Feistel网络

  

DES的基本结构,由IBM公司的霍斯特Feistel设计,因此称Feistel网络。在Feistel网络中,加密的每个步骤称为轮,经过初始置换后的64位明文,进行了16轮Feistel轮的加密过程,最后经过终结置换后形成最终的64位密文。如下为Feistel网络的示意图:
 DES、3 DES加密算法原理及其去语言实现“> <br/> ?64年<br/>比特明文被分为左、右两部分处理,右侧数据和子密钥经过轮函数f生成用于加密左侧数据的比特序列,与左侧数据异或运算,运算结果输出为加密后的左侧,右侧数据则直接输出为右侧。<br/>其中子密钥为本轮加密使用的密钥,每次Feistel均使用不同的子密钥。子密钥的计算,以及轮函数的细节,稍后下文介绍。由于一次Feistel轮并不会加密右侧,因此需要将上一轮输出后的左右两侧对调后,重复Feistel轮的过程,DES算法共计进行16次Feistel轮,最后一轮输出后左右两侧无需对调。<br/> ?<br/> DES加密和解密的过程一致,均使用Feistel网络实现,区别仅在于解密时,密文作为输入,并逆序使用子密钥。<br/>去标准库中DES算法实现如下:</p>
  <pre> <代码> func cryptBlock(注册表子项[]uint64, dst, src[]字节,解密bool) {
  b:=binary.BigEndian.Uint64 (src)//初始置换
  b=permuteInitialBlock (b)
  左,右:=uint32 (b>在32),uint32 (b)
  
  var注册表子项uint64//共计16次feistel轮
  我:=0;我& lt;16;我+ + {//加密和解密使用子密钥顺序相反
  如果解密{
  注册表子项=注册表子项[15]
  其他}{
  注册表子项=注册表子项[我]
  }//feistel轮函数
  左、右=右,左^ feistel(对的,注册表子项)
  }//最后一轮无需对调
  preOutput:=(uint64(右)& lt; & lt;32)| uint64(左)//终结置换
  binary.BigEndian。PutUint64 (dst permuteFinalBlock (preOutput))
  }//代码位置src/加密/des/block.go </代码> </pre>
  <h4>初始置换和终结置换</h4>
  <p>进入Feistel轮之前,64位明文需做一次初始置换.Feistel轮结束后,需做一次反向操作,即终结置换。<br/>附标准库中使用的初始置换表和终结置换表如下:</p>
  <pre> <代码>//初始置换表
  {var initialPermutation=[64]字节
  6日,14日,22日,30日,38岁,46岁,54岁,62年,
  4、12、20、28岁,36岁,44岁,52岁,60岁,
  2,10,18岁,26岁,34岁,42岁,50岁,58岁
  0、8、16、24、32、40、48、56岁
  7日,15日,23日,31日,39岁,47岁,55岁,63年,
  5日,13日,21日,29日,37岁,45岁,53岁,61年,
  3、11、19、27岁,35岁,43岁,51岁,59岁
  1、9、17、25、33岁的41岁,49岁,57岁
  }//终结置换表
  {var finalPermutation=[64]字节
  24日,56岁,16日,48岁,8日,40岁,0,32岁
  25日,57岁,17岁,49岁,9日,41岁,33岁
  26日,58岁,18岁,50岁,10,42岁,2,34岁
  27日,59岁,19日,51岁,11日,43岁,35岁,
  28岁,60岁,20岁,52岁,12日,44岁,4,36岁,
  53岁,29岁,61年,21日13日,45岁,37岁
  62,22岁,54岁,14岁,46岁,6,38岁,
  31日,63年,23岁,55岁,15岁,47岁,7,39岁,
  }//代码位置src/加密/des/const.go </代码> </pre>
  <h4>子密钥的计算</h4>
  <p> DES初始密钥为64位,其中8位用于奇偶校验,实际密钥为56位,64位初始密钥经过天池密钥置换后,生成56位串。经天池置换后56位的串,分为左右两部分,各28位,分别左移1位,形成C0和D0, C0和D0合并成56位,经天泉置换后生成48位子密钥K0.C0和D0分别左移1位,形成C1和D1, C1和D1合并成56位,经天泉置换后生成子密钥K1。以此类推,直至生成子密钥K15。但注意每轮循环左移的位数,有如下规定:</p>
  <pre> <代码> var ksRotations=[16] uint8 {1, 1、2、2、2、2、2、2、1、2、2、2、2、2、2、1}//代码位置src/加密/des/const.go <h2 class=DES、3 DES加密算法原理及其去语言实现