应用密码学(张仕斌)第四章

  • 分组密码
    • 特点:
      • 现代密码学中的重要体制之一,其主要任务是提供数据保密性
      • 分组密码加解密速度较快(对称密码特点)
      • 现代分组密码发展非常快,技术较成熟(公开测评) ,使用广泛
    • 示例:
    • 注意事项:
      • 从这章开始,假定加密和认证的文本、图像、音频等任何格式的原始信息,都存在相应的编码方式,转化为二进制的数据流。在具体算法中,表示为message={0,1}*
    • 定义:
      • 已知明文经过编码后的二元消息序列x1x2…(即0,1二进制序列),分组密码首先将二元序列按照固定长度进行分组,不妨设明文固定分组长度为nbits,则明文二元消息序列x1x2…划分为长度为nbits的分组p1,p2…,即:
      • 其中x,y,z ∈ GF(2) 。
      • 加密过程
        • 各明文分组长度依次在密钥K={k1k2…kt}控制下,按照加密算法E进行加密得到密文分组c1,c2…,即:
      • 解密过程
        • 将密文分组c1,c2… 。在密钥K={k1k2…kt}控制下,按照解密算法D进行解密,得到明文分组p1,p2…,即:
    • 形式转换
      • 定义 一个分组密码体制(P, K, C, E, D),其中P=C={0,1}^l ;K={0,1}^t.
      • 加密变换:E:P×K→C, 当k∈K确定时,Ek为P →C的一 一映射.
      • 解密变换:D: C×K →P, 当k∈K确定时,Dk为C →P的一 一映射.
    • 压缩、拓展
      • 上述分组密码系统中,明文分组长度为n bits,密文分组长度为m bits,密钥长度为t bits。若n>m,明文分组长度大于密文分组长度,称其为有数据压缩的分组密码;若n<m,明文分组长度小于密文分组长度,这称之为有数据扩展的分组密码;若n=m,明文分组长度等于密文分组长度,则称之为无数据扩展和压缩的分组密码。事实上,通常的分组密码均取为n=m
    • 分组密码的基本设计原则
      • 分组长度足够长,防止明文穷举攻击。
      • 密钥量足够大,防止密钥穷举攻击。
      • 密钥变换足够复杂,攻击者除了穷举攻击外找不到其它有效攻击方法。
      • 数据扩展足够小,一般无数据扩展。
      • 差错传播尽可能小,加密或解密某明文或密文分组出错,对后续密文解密影响尽可能小。
    • 分组密码的实现设计原则
      • 硬件实现原则
        • 应该尽量使得加密和解密算法结构相同,仅仅密钥使用方式不同,保证加密和解密采用同一密码协处理器。
        • 规则的编码结构,适应于大规模集成电路实现,降低成本。
        • 设计成迭代型,减少大规模集成电路实现时的硬件资源。
        • 易于硬件实现的编码结构。
      • 软件实现原则
        • 加密和解密结构相似,便于加密和解密过程软件实现可以方便调用子函数。
        • 尽量使用既简单又易于软件实现的运算,例如加法、乘法、移位运算。
        • 设计成迭代型。迭代型分组密码有利于软件实现中使用循环,代码简单。
        • 密码算法中尽量采用子块运算,运算长度尽可能适应软件编程,如8 bits、16 bits、32 bits或64 bits的单位长度。
    • 分组密码种类
    • 分组密码填充
      • 例:
    • 分组密码的原理
      • 迭代结构:
        • 选择某个较为简单的密码变换,在密钥控制下以迭代方式多次利用它进行加密变换,就可以实现预期的扩散和混乱效果。(轮函数)
      • 混淆:
        • 是指在加密变换过程中是明文、密钥以及密文之间的关系尽可能地复杂化,以防密码破译者采用统计分析法进行破译攻击。(线性ax+b=c/非线性ax^2+b=c)
      • 扩散:
        • 明文和密钥中任何一比特值得改变,都会在某种程度上影响到密文值的变化,以防止将密钥分解成若干个孤立的小部分,然后各个击破。(扩散函数)
    • 代替-置换(S-P)网络
      • 对明文和子密钥利用非线性代替S得到分组小块混淆和扩展,再利用比特置换P错乱非线性变换各输出比特 。AES、SM4、SHARK等
    • Feistel结构
    •  
  • DES简述
    • DES是对称密码算法,加密、解密密钥相同
    • DES的明文分组为64比特,密钥长度为64比特,有效密钥长度为56比特,密文长度为64比特。
    • DES加密,解密一共是16轮,每一轮需要用一个子密钥,故一共要产生16个轮子密钥,通常表示为K1,K2,K3, ……,K16.
    • DES的加密和解密,从流程图上和代码上几乎完全一致。只不过加密输入的是明文和密钥,解密输入的是密文和密钥。细节的差别在于,加密时使用的轮子密钥是K1,K2, K3, ……,K16,而解密时使用的轮子密钥是K16,K15, K14, ……,K1.换句话说,DES的16轮解密是其加密的每一轮的逆过程。
    • 置换变换
      • 置换位置改变,内容不变
    • DES算法的整体结构—Feistel结构
      • 给定明文,通过一个固定的初始置换IP来重排输入明文块P中的比特,得到比特串P0=IP(P)=L0R0,这里L0和R0分别是P0的前32比特和后32比特
        • 初始变换
        • 轮结构
      • 按下述规则进行16次迭代,即1≤i≤16
      • 这里⊕ 是对应比特的模2加,f是一个函数(称为轮函数);16个长度为48比特的子密钥Ki(1≤i≤16)是由密钥k经密钥编排函数计算出来的.最后一轮完成之后,还要进行一次左右交换!!!(切记)
      • 对比特串R16L16使用逆置换IP-1得到密文C,即C=IP-1 (R16L16)。(注意L16和R16的相反顺序)
        • 逆初始变换
        • IP和IP^-1之间的关系
    • DES的轮函数
      • 置换扩展变换
        • 置换位置改变,长度扩展
        • 例:
        • 8比特二进制 0010 1001
        • 第8位置换到第1位,第2位置换到第2,……,置换出结果:
        • 0 11 0 0 01 0 0 0
      • E盒置换扩展
      • 压缩替代S-盒
        • S盒的选择
      • 置换P
    • DES算法的密钥编排算法
      • 给定64比特密钥K,根据固定的置换PC-1来处理K得到PC-1(K)=C0D0,其中C0和D0分别由最前和最后28比特组成
        • 密钥置换PC-1
        • 左循环移位
          • C0及D0根据左循环移位函数进行左循环移位1或2位,各轮移位位数如表所示。
          • 置换选择PC-1输出的56位,分为两半,
          • C0=11101100 10011001 00011011 1011,
          • D0=10110100 01011000 10001110 0110。
          • C0及D0分别左循环1位得到
          • C1=1101100 10011001 00011011 10111
          • D1=0110100 01011000 10001110 01101
        • 密钥置换PC-2
        • 子密钥
          • 通过PC-2置换选择输出的就是DES第1轮的子密钥K1为001111 011000 111111 001101 001101110011 111101 001000,作为DES轮结构变换F函数的输入
          • 由前面的加密可知,DES加密一共是16轮,每一轮需要用一个子密钥,故一共要产生16个轮子密钥,通常表示为K1,K2, K3, ……,K16
    • DES的解密变换
      • DES的加密和解密,从流程图上和代码上几乎完全一致。只不过加密输入的是明文和密钥,解密输入的是密文和密钥。
      • 细节的差别在于,加密时使用的轮子密钥是K1,K2, K3, ……,K16,而解密时使用的轮子密钥是K16,K15, K14, ……,K1.
      • 换句话说,DES的16轮解密是其加密的每一轮的逆过程。
    • 2DES
      • 一个密钥有效长度56bit,两个密钥为56*2=112
        • 有效密钥长度112bits
    • 三重DES -EEE3
      • 个密钥有效长度56bit,三个密钥为56*3=168
        • 有效密钥长度168bits
    • DES-EEE2
      • 有效密钥长度112bits
    • DES-EDE2
      • 密钥长度112bits
  • AES
    • AES是Rijndael算法改进,分组长度128bits,密钥长度则有三种:128/192/256bits
    • 轮数与密钥长度,明文分组长度的关系
    • 现阶段的AES(所学)均认为明文分组为128bits
    • AES算法的整体结构
    • AES的基本运算单位是字节(Byte),加密和解密过程都是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”或者“状态”。字节矩阵初始值是一个明文块(块/分组,block)
    • 明文分组
      • 状态用以字节(8bits)为基本构成元素,每列4bytes数据,即为32bits。对于Rijndael算法,明文列数为分组长度除以32,通常记为Nb 。
      • Nb=分组长度(bits)/32(bits)
      • Rijndael算法列数Nb可以取的值为4、6、8,对应的明文分组长度为128、192、256bits。
      • 而AES算法的分组长度固定为128bits,因此AES明文列数等于固定值Nb=4。
    • 密钥分组
      • AES算法加密和解密过程中密钥同样以字节为单位进行计算,密钥状态矩阵也是4行,每列4bytes数据,即为32bits。因而密钥列数记为Nk 。
      • Nk=密钥长度(bits)/32(bits)
      • AES算法的密钥长度的列数为128bits、192bits、256bits三种不同长度,因此不同密钥长度Nk可以取值分别为4、6、8。
    • AES算法的加密整体结构
    • 明文初始状态矩阵(state)
      • AES算法中初始状态矩阵由1组长度为128bits明文分组构成,以字节为单位,则总共有16bytes,从左到右开始,则前4个字节组成明文状态矩阵第1列,依次后四个字节组成第2列,依次类推,AES算法明文分组可以构成一个4×4的初始字节状态矩阵
    • 密钥初始矩阵
      • AES算法的密钥长度的列数为128\192\256bits三种不同长度,因此不同密钥长度Nk(密钥列数)以取值分别为4、6、8。
      • 初始密钥的列数编排类似明文初始状态矩阵,因而密钥构成一个4×4、4×6、4×8的密钥字节矩阵。例如密钥长度为192bits,以字节为单位,则总共有24bytes
    • 轮密钥加
    • 字节代替(SubBytes)
      • 字节变换(SubBytes)使用一个S盒,S盒是一个16×16的矩阵,如表所示。其非线性置换为:输入的列的每个元素用来指定S盒的地址:前4位指定S盒的行,后4位指定S盒的列。行和列所确定S盒位置的元素取代输入矩阵中相应位置的元素,例如“03”,行0,列3,因此输入“03”,输出“7B”。
      • 例:
    • 行移位(ShiftRows)
      • 状态阵列的4个行循环以字节为基本单位进行左移,而每行循环做移的偏移量是由明文分组的大小和所在行数共同确定,即列数Nb和行号确定。
      • 例:
    • 列混合(MixColumns)
    • 基本运算(补充)
      • 字节在 GF(2^8)的表示
      • GF(2^8)上两个域元素的加
      • GF(2^8)上两个域元素的乘
      • GF(2^8)上域元素的乘x
      • 因此可以得出若b7=0,可以得出.x·b(x)的结果就是b(x)对应的8bits 二进制向左移一位,最后一位补0.
      • 因此可以得出若b7=1,可以得出.x·b(x)的结果就是b(x)对应的8bits 二进制向左移一位,最后一位补0,再与{1B}(其二进制为00011011,多项式表示为x*+x3+.x+1)做逐比特异或来实现.
      • 例:
    • 密钥扩展
      • Rijndael算法的密钥同样以字节为单位进行变换,用一个4行的二维矩阵来表示。密钥按照矩阵的列进行分组,密钥比特的总数等于明文分组长度乘以轮数加1,即密钥比特的总数=明文分组长度×(轮数Round+1)
      • 轮密钥选取
        • 轮密钥i(即第i个轮密钥)由轮密钥缓冲字W[Nb*i]到W[Nb*(i+1)]给出:
    • 三种拓展
    • AES 的密钥调度
      • 密钥调度包括两个部分:密钥扩展和轮密钥选取。密钥bit的总数=分组长度×(轮数Round+1)例如当分组长度为128bits和轮数Round为10时,轮密钥长度为128×(10+1)=1408bits。将密码密钥扩展成一个扩展密钥。从扩展密钥中取出轮密钥:第一个轮密钥由扩展密钥的第一个Nb个字(其实就是Nb列),第二个轮密钥由接下来的Nb个字组成,以此类推。
    • 解密
      • 逆行移位
        • 与加密时行移位相反,向右循环移位
      • 逆列混合
        • 与加密时行列混合运算过程一样,固定矩阵改变
      • 具体实例
        • 现在我们来跟踪AES加密算法的每一个迭代,以观察所有操作对输出影响。
        • 假设加密的明文消息为128比特示例块为十六进制为:80 5E 6A 36 53 25 3A 66 63 35 69 03 20 6C 28 06 16;初始密钥也为128比特,十六进制表示为:75 35 6B 99 05 61 39 56 73 62 05 31 00 5509 32
        • 首先,将128比特的明文块写成4×4的矩阵形式为:
  • 分组密码体制
    • SM4算法
      • 定义
        • SM4(原名SMS4.0)是我国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布。相关标准为“GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。
        • 在商用密码体系中,SM4主要用于数据加密,其算法公开,分组长度与密钥长度均为128bit,加密算法与密钥扩展算法都采用32轮非线性迭代结构,S盒为固定的8比特输入8比特输出。
        • SM4算法的解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
      • 算法原理
      • 加密流程整体框图
      • SM4加密符号定义
      • SM4的F轮函数
      • SM4-S盒代替
        • SM4算法中S盒代替与AES算法S盒代替类似,S盒的代替规则:输入的前4位为行号,后4位为列号,行列交叉点处S盒列表中的数值为输出(如表4-13),例如输入“2a”,则行号为“2”,列号为“a”,根据表4-13,第2行第a列输出值为“0b”,即Sbox(2a)=0b。
      • SM4一轮加密实例
      • SM4的加解密总结
        • 1、SM4是对称密码算法,加密、解密密钥相同
        • 2、SM4的明文分组为128比特,密钥长度为128比特,密文长度为128比特。
        • 3、SM4加密,解密一共是32轮非线性迭代,然后再进行反序变换,输出密文,每一轮需要用一个子密钥,故一共要产生32个轮子密钥,通常表示为
        • 4、SM4的加密和解密,从流程图上和代码上几乎完全一致。只不过加密输入的是明文和密钥,解密输入的是密文和密钥。
        • 细节的差别在于,加密时使用的轮子密钥是
        • 而解密时使用的轮子密钥是
      • SM4密钥编排算法
        • 密钥拓展算法
        • 例:
  • 典型的分组密码体制
    • IDEA基本概念
      • IDEA(International Data Encryption Algorithm)是瑞士的James Massey,Xuejia Lai等人提出的加密算法,在密码学中属于数据块加密算法(Block Cipher)类。IDEA使用长度为128bit的密钥,数据块大小为64bit。从理论上讲,IDEA属于“强”加密算法,至今还没有出现对该算法的有效攻击算法。
      • IDEA是一个分组长度为64位的分组密码算法,密钥长度为128位(抗强力攻击能力比DES强),同一算法既可加密也可解密。
      • IDEA能抗差分分析和相关分析;IDEA似乎没有DES意义下的弱密钥;IDEA的“混淆”和“扩散”设计原则来自三种运算,它们易于软、硬件实现(加密速度快)
    • IDEA运算
      • 实现上的考虑
        • 使用子分组:16bit的子分组;
        • 使用简单操作(易于加法、移位等操作实现)
        • 加密解密过程类似;
        • 规则的结构(便于VLSI实现)。
    • IDEA设计原理
      • 3种运算结合起来使用可对算法的输入提供复杂的变换,从而使得对IDEA的密码分析比对仅使用异或运算的DES更为困难。
      • 算法中扩散是由称为乘加(multiplication/addition, MA)结构(见图4.14)的基本单元实现的。
      • 该结构的输入是两个16比特的子段和两个16比特的子密钥,输出也为两个16比特的子段。这一结构在算法中重复使用了8次,获得了非常有效的扩散效果。
    • IDEA的MA结构
      • IDEA算法的扩散主要是由乘加结构的基本单元实现的。
    • IDEA加密的总体方案
    • IDEA加密过程
      • 加密过程由连续的8轮迭代和一个输出变换组成,算法将64比特的明文分组分成4个16比特的子段,每轮迭代以4个16比特的子段作为输入,输出也为4个16比特的子段。
      • 最后的输出变换也产生4个16比特的子段,链接起来后形成64比特的密文分组。
      • 每轮迭代还需使用6个16比特的子密钥,最后的输出变换需使用4个16比特的子密钥,所以子密钥总数为52。图4.15的右半部分表示由初始的128比特密钥产生52个子密钥的子密钥产生器。
    • IDEA第1轮的轮结构
      • 根据IDEA第1轮的结构示意图,以后各轮也都是这种结构,但所用的子密钥和轮输入不同。从结构图可见,IDEA不是传统的Feistel密码结构。每轮开始时有一个变换,该变换的输入是4个子段和4个子密钥,变换中的运算是两个乘法和两个加法,输出的4个子段经过异或运算形成了两个16比特的子段作为MA结构的输入。MA结构也有两个输入的子密钥,输出是两个16比特的子段。
      • 最后,变换的4个输出子段和MA结构的两个输出子段经过异或运算产生这一轮的4个输出子段。注意,由X2产生的输出子段和由X3产生的输出子段交换位置后形成W12和W13,目的在于进一步增加混淆效果,使得算法更易抵抗差分密码分析。
    • IDEA每一轮的加密顺序
      • 1. X1和第一个子密钥相乘。
      • 2. X2和第二个子密钥相加。
      • 3. X3和第三个子密钥相加。
      • 4. X4和第四个子密钥相乘。
      • 5. 将第1步和第3步的结果相异或。
      • 6. 将第2步和第4步的结果相异或。
      • 7. 将第5步的结果与第五个子密钥相乘。
      • 8. 将第6步和第7步的结果相加。
      • 9. 将第8步的结果与第六个子密钥相乘。
      • 10.将第7步和第9步的结果相加。
      • 11.将第1步和第9步的结果相异或。
      • 12.将第3步和第9步的结果相异或。
      • 13.将第2步和第10步的结果相异或。
      • 14.将第4步和第10步的结果相异或。
      • 算法的第9步是一个输出变换,如图4.17所示。它的结构和每一轮开始的变换结构一样,不同之处在于输出变换的第2个和第3个输入首先交换了位置,目的在于撤销第8轮输出中两个子段的交换。还需注意,第9步仅需4个子密钥,而前面8轮中每轮需要6个子密钥。
    • IDEA的输出变换
    • IDEA子密钥的产生
      • 加密过程中52个16比特的子密钥是由128比特的加密密钥按如下方式产生的: 前8个子密钥Z1,Z2,…,Z8直接从加密密钥中取,即Z1取前16比特(最高有效位),Z2取下面的16比特,依次类推。然后加密密钥循环左移25位,再取下面8个子密钥Z9,Z10,…,Z16,取法与Z1,Z2,…,Z8的取法相同。这一过程重复下去,直到52子密钥都被产生为止。
      • 产生子密钥的方法。这个算法用了52个子密钥(8轮中的每一轮需要6个,其他4个用于输出变换)。首先,将128-位密钥分成8个16-位子密钥。这些是算法的第一批8个子密钥(第一轮6个,第二轮的头2个)。然后,密钥向左环移动25位产生另外8个子密钥,如此进行直到算法结束。
    • IDEA子密钥
      • IDEA的解密过程
        • 加密解密实质相同,但使用不同的密钥;
        • 解密密钥以如下方法从加密子密钥中导出:
          • 解密循环i的头4个子密钥从加密循环10-i的头4个子密钥中导出;解密密钥第1、4个子密钥对应于1、4加密子密钥的乘法逆元;2、3对应2、3的加法逆元;
          • 对前8个循环来说,循环i的最后两个子密钥等于加密循环9- i的最后两个子密钥;
  • RC5或RC6
    • 背景
      • RC5是由RSA公司的Rivest于1994年提出一种新型分组密码。RC6是RSA公司提交给NIST的一个AES候选算法,它是在RC5的基础上设计的.
      • RC5的算法特性与许多算法不尽相同,它具有有可变的字长(因此输入的分组长度是可变的),可变的加密轮数和可变的密钥长度;只使用了微处理器上常实现,另一方面,由于没有复杂的运算,它的加密速度非常快。
      • RC5已经在RSA公司的许多产品应用,比如作为无线客户端与服务器之间的加密算法。
      • RC6是AES候选算法之一,由Rivest、Robshaw、Sidney和Yin提交的,它可能是最简单的AES算法,RC6是RC5的进一步改进。像RC5那样,RC6实际上是利用数据的循环移位。它的明文分组块大小为128位,密钥可以为128、192或256比特,共进行20轮的加密。
    • Twofish算法
      • Twofish 是counterpane 公司向NIST提交的一种满足AES要求的加密算法,设计者为Schneier。
      • Twofish 采用128位数据块(128 bits block),128、192、256-bit 可变长度密钥。
      • Twofish 算法是进入NIST第二轮 5种加密算法中的一种,它同时具有RC6和Rijndael的某些特性,与DES算法一样,使用了16轮的Feistel结构来加密明文,并应用了一些特殊的操作
  •  
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值