一、对称加解密

  分类:流密码、分组密码

  流密码:把明文以比特划分单位,每一个比特与密钥做异或运算,得到密文。解密的时候用同一把密钥与密文做逐比特异或运算得到明文。

分组密码:把原始明文分为等长的分组,一个分组一个分组的处理

分组加密的原理用到古典密码的代换(把原始字母替换成其他字母或者符号)、置换(原始字母没有改变只是打乱了次序)、异或、一次一密等技术。之所以这样设计是用到了上个世纪两个实现加密信息非常典型的技术——混淆和扩散。混淆就是使输入位和输出位没有明显的统计关系;扩散就是移位操作,他原本在第1个比特我把他移到第5比特。

一组数据经过代替(S盒)的长度可能等长、可能压缩、可能扩展,如下图所示。当有较长的原始数据时就需要用户多个代替盒,多个代替模块之间没有关系。

DigestUtils 加密解密 des加密解密原理_异或运算

 

   要向解决各个代替模块之间没有关联的问题就需要与置换(P)结合一下

DigestUtils 加密解密 des加密解密原理_数据_02

 

Feistel网络结构是为了解决一次一密的问题,密钥+其他数据+替换和换位使得每一次的密钥流都不一样。以下得到的密文不是最终密文,需要迭代做多次。

DigestUtils 加密解密 des加密解密原理_分组密码_03

  看了以上这个图有一个问题,这个“其他数据”从何而来,其实就是子密钥。后面祥说子密钥的产生过程。

DigestUtils 加密解密 des加密解密原理_分组密码_04

 二、DES原理

  以上内容都是DES算法的铺垫。DES加密用于保护政府机构和商业部门非机密的敏感数据,保护传输信道上的数据。

  DES的特点:1、属于分组密码。明文、密文、密钥(其中8个bit做奇偶校验)都是64bit;2、面向二进制的密码算法;3、加密和解密算法一样;4、属于feisitel结构;

  DES的算法框架。

DigestUtils 加密解密 des加密解密原理_异或运算_05

     64bit的明文,经初始置换,分为左右各32bit,记为L和R,下标从1-16,进入feisitel结构。对于密钥这块,他经过子密钥扩展算法产生16个48bit的key,下标也1-16。经过16论运算得到R16、L16最后再经一个逆初始置换最终得到密文。

第一个模块密钥扩展生成16个子密钥;第二模块16论feisitel。

密钥扩展:1、置换选择1,从64bit密钥去除8bit的奇偶校验,打乱重排,把剩下的56bit分为两个28bit,记为Ci、Di;

          2、分部对两个28bit进行循环移位;

         3、置换选择2,从56bit中筛选出48bit。至此第一轮的key1生成。

       以上过程一共重复16轮。

  子密钥产生示意图

DigestUtils 加密解密 des加密解密原理_数据_06

16论feisitel

DigestUtils 加密解密 des加密解密原理_数据_07

   第一步、初始置换。根据初始置换表把64bit明文打乱,分为L0(32bit)、R0(32bit)。逆初始置换表则是还原回去。

              

DigestUtils 加密解密 des加密解密原理_分组密码_08

 

 

                             初始置换表

    第二步、加密函数F。输入参数是Ri(32bit)和48bit(子密钥),输出结果再与Li做异或得到Li+1。

     F函数的具体操作是把32bit的Ri扩展置换成48bit,再与48bit的子密钥做异或,实现数据与密钥的混合。然后把得到48bit,再分为8组,每组做压缩置换。输出4×8=32bit,对32bit打乱。

DigestUtils 加密解密 des加密解密原理_数据_09

  第三步、逆初始置换。