zoukankan      html  css  js  c++  java
  • 分组密码体制

    分组密码是将明文消息编码表示后的数字序列划分成长为n的组,每个组(可称为长度为n的矢量)分别在密钥控制下变换成等长的输出数字序列。
    其加密函数E:V_n × K → V_m。 其中V_n和V_m分别为n维和m维的矢量空间,K为密钥空间。它与流密码不同之处在于输出的每一位数字不是只与相应时刻输入的明文数字有关,而是与一组长为n的明文数字有关。这种密码实质上是字长为n的数字序列的代换密码。

    混淆和扩散

    1. 混淆(Confusion) 是一种加密操作,使得密钥与密文之间的关系变得模糊(通过代换器来完成,即S盒)
    2. 扩散(Diffusion) 是一种加密操作,使得一个明文符号能够分散为多个密文符号,其目的是隐藏明文字符出现次数的统计概率。

    Feistel密码结构

    Feistel提出利用乘积密码可获得简单的代换密码,乘积密码指顺序地执行两个或多个基本密码系统,使得最后的密码强度高于每个基本密码系统产生的结果。其思想实际上是Shannon提出的利用乘积密码实现混淆和扩散思想的具体应用。

    Feistel加密结构

    加密算法的输入是分组长为2w的明文和一个密钥k,将每组明文分成左右两半L和R,在进行完n轮迭代后,左右两半再合并到一起产生密文分组。第i轮迭代的前一轮输出的函数:

    L_i = R_{i-1}
    R_i = L_{i-1} xor F(R_{i-1}, k_i)

    Feistel解密结构

    解密过程本质上和加密过程是一样的,算法使用密文作为输入,但使用子密钥K_i的次序与加密过程相反。这一特征保证了解密和加密可采用同一算法。

    DES算法描述

    明文分组长度为64比特,密钥长度为56比特。在加密过程中将有三个阶段:

    1. 一个初始置换IP,用于重新排列明文分组的64比特数据。
    2. 进行具有相同功能的16轮变换,每轮变换中都有置换和代换运算,在第16轮变换的输出后,将结果分成左右两半,并交换次序。
    3. 最后再经过一个逆初始置换逆IP从而产生64比特密文。

    这里需要注意的是,无论是初始置换还是最终的逆初始置换,都不能增减DES的安全性。其设计的初衷并不被人所知,但是看起来其目的是将明文重新排列,使之适应8-bit寄存器。其映射规则如下:矩阵为8×8矩阵,自左至右,自上至下依次排位,矩阵中的某次位数目即为明文中该次位的比特值映射到buffer的偏移量。

    f函数

    f函数在DES的安全性中起到了至关重要的作用,f函数的作用是将上一轮的右半边的结果,以及该轮所获得的密钥作为输入数据,输出结果是通过异或操作来加密。

    在f函数最开始时,首先将32-bit数据扩展为48-bit数据,参照的方法为通过E矩阵进行扩展。扩展(或称为映射)方法与IP形似。

    第二步,48-bit的结果将会按位与该轮对应的子密钥(48位)异或。

    第三步,将48-bit数据切分成8个6-bit数据,分别作为8个不同的代换盒子(s-box)的输入数据,s-box用于实现代换操作。每一个s-box包含64个实体,存放于4×16的矩阵之中。其代换规则如下:取6-bit数据中最高位比特数以及最低位比特数作为行数,剩余四位在中间的比特数作为列数,由此可以取出s-box中某行某列的数,该数为0-15之间,即输出结果为4-bit数据。

    对于s-box的设计有以下特性:

    1. 每一个s-box都是以6-bit数据作为输入,4-bit数据作为输出
    2. 输出数据与输入数据无线性关系
    3. 如果6-bit数据中最高位与最低位的值是确定的,剩余四位是变化的,则输出的4-bit数据不得出现重复
    4. 如果输入到s-box中的数据中有一位不同,则输出的数据必须要求至少有两位不同
    5. 如果输入到一个s-box中的两个数据有在中间比特位上有两个不同,那么输出数据必须至少有两位不同
    6. 如果输入到一个s-box中的两个数据在头两个比特位上有不同,在最后两位上相同,那么两个输出数据必须不同

    s-box是DES加密中最重要的元素,因为他们实现了非线性加密 : S(a) xor S(b) != S(a xor b)

    子密钥生成器

    输入DES的56-bit密钥首先要经过一个置换运算,其置换规则与上文IP矩阵类似。这里需要首先明确一点,DES的输入密钥通常是64-bit的,真实的56-bit密钥生成的算法是:将64-bit分成8组,每组8-bit,仅取每组前7-bit组成56-bit密钥。每个子密钥是为48-bit。

    56-bit密钥首先将会分成两部分,这两部分将会各自循环移位。其移位规则如下:

    • 在第1、2、9、16轮时,两个子部密钥向左循环移位1-bit
    • 在其它轮时,两个子部密钥向左循环移位2-bit

    我们可以发现,16轮过后,两个子部密钥正好旋转了28-bit,即旋转一周。

    在每一轮中,为了生成48-bit子密钥,需要进行子置换,其输入数据为旋转后得到的密钥舍去8-bit,而后再用一个6×8的矩阵进行置换,置换规则如上所述。所以,56-bit的密钥中每一位,都会在16轮中的14轮里使用到。

    解密过程

    DES的解密和加密使用同一个算法,但是子密钥使用的顺序却是相反的

    因此在解密过程中,子密钥的循环移位规则与加密过程有不同

    • 在第1轮时,密钥不进行循环移位
    • 在第2、9、16轮时,两个子部密钥向右循环移位1-bit
    • 剩余轮时,两个子部向右循环移位2-bit

    而在Feistel网络中的解密解析如下:
    我们可以分析得出:
    解密L0 = 加密R16
    解密R0 = 加密L16 = 加密R15
    解密L1 = 解密R0 = 加密L16 = 加密R15

    解密R1 = 解密L0 xor f(解密R0, k16) = 加密R16 xor f(加密L16, k16) = (加密L15 xor f(加密R15, k16)) xor f(加密R15, k16) = 加密L15

    如此,可以推算出解密算法可逆。

    分组密码运行模式

    分组密码在加密的时候,明文分组长度是固定的,但在实际应用过程中往往难以保证明文的长度。因此为了能在各种场合使用DES,定义了DES的四种运行模式:

    1. 电码本(ECB)模式:每个明文组独立地以同一个密钥进行加密,用于传送短数据
    2. 密码分组链接(CBC)模式:加解密算法的输入是当前明文组与前一个密文组的异或,用于传送数据分组和认证
    3. 密码反馈(CFB)模式:每次只处理输入的比特,将上次密文用作加密算法的输入,用以产生伪随机输出,再将该输出与当前明文异或获取当前密文,主要用于传送数据流和认证
    4. 输出反馈(OFB)模式:与CFB类似,但本次加密算法的输入为前一次加密算法的输出,主要用于在有干扰信道上的数据流传送。
  • 相关阅读:
    JDK7与JDK8环境共存与切换:先安装jdk7,配置好环境变量后再安装jdk8
    Maven环境配置
    JDK的安装
    Access2010打开系统表MSysObjects的控制权限
    Spring aop 简单示例
    redis集群搭建
    springmvc中拦截器与springmvc全局异常处理器的问题
    自定义springmvc统一异常处理器(实现HandlerExceptionResolver接口)不起作用的一种情况
    一句SQL实现MYSQL的递归查询
    2002年的决战坦克,重新玩一遍。qq群号:1035127306
  • 原文地址:https://www.cnblogs.com/gscienty/p/5991806.html
Copyright © 2011-2022 走看看