zoukankan      html  css  js  c++  java
  • 分组密码加密操作模式

    密码其目的为,通过加密数据为Alice发给Bob的消息提供了保密性。

    电子密码本模式(ECB)

    一种最直接的消息加密方式。若分组密码加密分组大小为b位,则如果长度超过b位时,消息将被分割为欸大小为b位的分组。如果消息长度不是b位的整数倍,则在加密前必须将其填充为b位的整数倍。

    由于传输问题导致接收方没有收到所有的加密分组时,接收方还是可能解密已收到的分组。但ECB模式最大的问题在于它的加密是高度确定的(只要密钥不变,相同的明文分组总是产生相同的密文分组),即ECB模式可以看作是巨大的密码本,每个输入都映射到特定的输出。

    ECB容易遭受流量攻击、容易遭受代换攻击、容易遭受统计分析攻击。

    因此,人们期望每次加密相同的明文会得到不同的密文,这种行为叫做“概率加密”。人们可以引入一些随机化初始向量来实现概率加密。下面所有模式都使用初始向量来实现概率加密。

    密码分组链接模式(CBC)

    该操作模式主要思想有两种:

    1. 所有分组加密都链接在一起,使得密文yi不仅依赖于分组xi,而且还依赖于前面所有的明文分组。
    2. 加密过程使用初始向量进行了随机化。
    • 加密(第一个分组) y1 = ek(x1 xor IV)
    • 加密(一般分组) yi = ek(xi xor y{i-1}) i >= 2
    • 解密(第一个分组) x1 = ek^-1(y1) xor IV
    • 解密(一般分组) xi = ek^-1(ti) xor y{i-1} i >= 2

    但加密本身还是不够的,我们还需要保护消息的完整性(通过消息验证码(MAC)或数字签名实现)

    输出反馈模式(OFB)

    首先使用分组密码加密IV,得到的密钥输出为b位密钥序列的第一个集合;将前面一个密钥输出反馈给分组密码进行加密,即可计算出密钥序列位的下一个分组;不断重复这个过程。
    该该模式形成了一个同步序列密码。(由于密钥既不依赖明文,也不以来密文),并且,由于OFB形成的是一个序列密码,因此加密操作和解密操作完全相同。接收者也并没有通过解密模式e-1()中的分组密码来解密密文(因为实际加密是通过xor实现,可循环)

    • 加密(第一个分组)s1 = ek(IV) 且 y1 = s1 xor x1
    • 加密(一般分组) si = ek(s{i-1}) 且 yi = si xor xi i >= 2
    • 解密(第一个分组) s1 = ek(IV) 且 x1 = s1 xor y1
    • 解密(一般分组) si = ek(s{i-1}) 且 xi = si xor yi i >= 2

    密码反馈模式(CFB)

    也使用分组密码为构建序列密码的基本元件。与OFB模式相同的是,CFB也是用了反馈;而不同的是OFB反馈是分组密码的输出,而CFB反馈的是密文。与OFB模式一样,密钥序列不是按位产生的,而是以分组方式产生的。

    由于CFB模式产生的是序列密码,所以加密和解密操作完全相同。CFB模式是一个异步序列密钥示例,因为序列密钥输出也是密文的函数。

    • 加密(第一个分组) y1 = ek(IV) xor x1
    • 加密(一般分组) yi = ek(y{i-1}) xor xi i >= 2
    • 解密(第一个分组) x1 = ek(IV) xor y1
    • 解密(一般分组) xi = ek(y{i-1}) xor yi i >= 2

    计数器模式(CTR)

    使用分组密码作为序列密码的另一种模式是计数器(CTR)模式。密钥序列也是以分组方式计算的。分组密码的输入为一个计数器,每当分组密码计算一个新密钥序列分组时,该计数器都会产生一个不同的值。

    • 加密: yi = ek(IV || CTRi) xor xi i >= 1
    • 解密: xi = ek(IV || CTRi) xor yi i >= 1

    伽罗瓦计数器模式(GCM)

    这是一种计算消息验证码的加密模式,MAC提供了一种密码校验和。通过GCM使用计数器模式下的加密保护了明文x的机密性(GCM不仅保护了明文x的可靠性,而且也保护了字符串AAD的可靠性)

    1. 加密:
      a) 利用IV得到计数器值CTR0,并计算CTR1 = CTR0 + 1;
      b)计算密文: yi = ek(CTRi) xor xi i >= 1
    2. 认证:
      a) 生成认证子密钥 H = ek(0)
      b) 计算g0 = AAD × H(伽罗瓦域乘法)
      c) 计算g = (g{i-1} xor yi) × H 1 <= i <= n (伽罗瓦域乘法)
      d) 最终认证标签: T = (gn × H) xor ek(CTR0)
  • 相关阅读:
    Firemonkey绑定对象列表
    Firemonkey 自定义Button的Style
    Delphi中使用GDI+进行绘图(2)
    Delphi中使用GDI+进行绘图(1)
    很好用的一个类:TJvAppXMLFileStorage
    我的Win32开发抉择,Delphi老将复出
    实现动态的XML文件读写操作
    一个简单的统计图像主颜色的算法(C#源代码)
    开始使用THREE.JS
    C++应用程序在Windows下的编译、链接(一)概述
  • 原文地址:https://www.cnblogs.com/gscienty/p/6050143.html
Copyright © 2011-2022 走看看