通常,大多数的分组加密算法都是把数据按照64位分组的方式进行加密和解密。但是几乎所有的加密工作所涉及的数据量都远远大于64位,因此就需要不断地重复加密过程,直到处理完所有的分组。这种分组加密中所涉及的重复性方式称为分组加密模式。

处理多个数据分组最简单的方式是将每一个生成的密文分组添加到之前生成的密文分组之后。这种简单的方式被称为ECB,或者电子码本(electronic code book)。这种方法的简单性使其比较流行,但它相对来说是不安全的。主要问题是,对于任意给定的密钥,相同的明文分组加密之后得到的密文结果总是一样的,即明文和密文的分组是一一对应的关系。假如黑客破解了哪怕一小段数据,他就可以以此建立一个密码本,来对其他数据段进行破解。

一种更好的方法是CBC或被称为密码分组链接的模式

CBC模式通过对分组密码增加简单的操作和反馈避免ECB中出现的问题。反馈使得密文的每个分组都同之前执行的操作在一定程度上有依赖关系(ECB中每个分组的加密和解密都是独立的)。在CBC模式中,用之前的密文分组作为反馈,这样就算是明文中的同一个分组,每次都好像加密成另一个不同的密文分组一样。

对于之前作为反馈的密文分组,在加密一个明文分组前,将前一个输出的密文分组与该明文分组求异或,然后再加密

当解密时,将前一个输出的明文分组同接下来待解密的密文分组求异或,然后再解密。这两种方式可以简单的表示为:

Ci = Ek(P⊕ Ci-1)

Pi = Ci-1 ⊕ Dk(Ci)

这里Ci和Pi为缓冲区C和P中的第(i)个密文和明文分组而Ek和Dk是使用密钥K进行的加密和解密操作

通常,会在明文的开始处增加一个随机的数据块。这是因为即使有黑客知道明文的第一个分组包含的信息,它也不能用于模拟链接的顺序。这个增加的随机数据块称为 初始向量。按照正常的方式对其加密,这里不需要任何反馈。然后,将加密后的初始向量作为接下来加密和解密第一个分组数据的反馈

下面的示例中给出了两个函数(cbc_encipher和cbc_decipher)的实现。它们采用DES算法中的CBC模式来对缓冲区中的数据做加密和解密的动作。

函数cbc_encipher接受一个size字节大小的明文缓冲区作为参数,使用key作为密钥来对其加密。该函数假设明文的第一个分组是64位的初始向量。

函数cbc_decipher接受一个size字节大小的密文缓冲区作为参数,使用key作为密钥来对期解密。为了保持对称性,初始化向量也要解密,并作为明文的第一个分组返回。

两个函数的时间复杂度都是O(n),这里n代表加密或解密的分组数量。这是因为这两个函数都只是简单地调用复杂度同为O(1)的des_encipher和dex_decipher,每处理一个分组调用一次。

示例:DES算法的CBC模式实现

/*cbc.c*/
#include <stdlib.h> #include "bit.h"
#include "cbc.h"
#include "encipher.h" /*cbc_encipher DES算法中的cbc加密模式*/
void cbc_encipher(const unsigned char *plaintext, unsigned char *ciphertext, const unsigned char *key, int size)
{
unsigned char temp[];
int i; /*加密初始化向量*/
des_encipher(&plaintext[],&ciphertext[],key); /*使用DES算法中的CBC模式加密缓冲区*/
i=;
while(i < size)
{
bit_xor(&plaintext[i], &ciphertext[i-], temp, ); /*temp = Pi XOR Ci-1*/
des_encipher(temp,&ciphertext[i],NULL); /*Ek(temp)*/
i=i+;
}
return;
} /*cbc_descipher DES算法中的cbc解密模式*/
void cbc_decipher(const unsigned char *ciphertext, unsigned char *plaintext, const unsigned char *key, int size)
{
unsigned char temp[];
int i; /*解密初始化向量*/
des_decipher(&ciphertext[], &plaintext[], key); /*使用DES算法中的CBC模式解密缓冲区*/
i=;
while(i < size)
{
des_decipher(&ciphertext[i],temp,NULL); /*temp = Dk(Ci)*/
bit_xor(&ciphertext[i-], temp, &plaintext[i], ); /*Ci-1 XOR temp*/
i=i+;
}
return;
}

DES加密算法应用:分组加密模式的更多相关文章

  1. 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码

    JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...

  2. 实现五种分组加密模式ECB,CBC,CFB,OFB,CTR

    没什么好说的,简单无脑! #include<iostream>using namespace std; int ECB(){ int duan[4]; int messageLen = 1 ...

  3. 数据加密算法--详解DES加密算法原理与实现

    DES算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一.DES是对称的,也就是说它使用同一个密钥来加密和解密数据. DES还是一种分组加密算法,该算法每 ...

  4. 浅谈DES加密算法

    一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...

  5. DES加密模式详解

    DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...

  6. 分组加密的四种模式(ECB、CBC、CFB、OFB)

    加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption).对称加密又分为分组加密和序列密码.分组密码,也叫块加密(bl ...

  7. go加密算法:CBC对称加密(一)--DES

    package main import ( "bytes" //"crypto/aes" "crypto/cipher" "cry ...

  8. DES算法与四种加密模式的代码实现(C++语言)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Love_Irelia97/article/ ...

  9. Aes加密算法加密模式介绍

    本文转自:https://www.jianshu.com/p/582d3a47729a AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中 ...

随机推荐

  1. java多线程 生产者和消费者 lock

    package com.atguigu.thread.lock; import java.util.concurrent.locks.Condition; import java.util.concu ...

  2. mysql7笔记----遍历节点所有子节点

    mysql遍历节点的所有子节点 DELIMITER // CREATE FUNCTION `getChildrenList`(rootId INT) ) BEGIN ); ); SET sTemp = ...

  3. 禁止WPS2019开机自启动

    最近开机发现WPS总是自己启动,导致开机速度会慢5s左右,从网上找了很多办法都没用,包括运行+msconfig,启动项里面没有WPS:杀毒软件自启动管理里面也没有找到WPS,百度了一圈也没有找到任何有 ...

  4. Spring 进入Controller前参数校验

    在进入Controller前完成参数的校验,针对对象参数 分为两个验证方式 (1)直接使用已定义的校验方式 1.在需要进行校验的属性上增加校验类型注解 import java.util.Date; i ...

  5. [JLOI2016] 成绩比较

    推石子 首先设\(d[i]=\sum_{t=1}^{U[i]}t^{n-R[i]}(U[i]-t)^{R[i]-1}\),即第\(i\)门课程分数的合法分布方案数: 然后设\(f[i,j]\)表示前\ ...

  6. Hangfire源码解析-任务是如何执行的?

    一.Hangfire任务执行的流程 任务创建时: 将任务转换为Type并存储(如:HangFireWebTest.TestTask, HangFireWebTest, Version=1.0.0.0, ...

  7. Python + PyQt5 实现美剧爬虫可视工具(二)

    美剧<权力的游戏>终于开播最后一季了,在上周写了个简单的可视化美剧的爬虫软件来爬取美剧,链接:https://www.cnblogs.com/weijiutao/p/10614694.ht ...

  8. Java进阶篇设计模式之四 -----适配器模式和桥接模式

    前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...

  9. Flink从入门到放弃(入门篇1)-Flink是什么

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

  10. SmartSql Map

    SmartSqlMap 属性 说明 Scope 域,用于SqlMap定义Sql声明范围 Statement标签 属性 说明 Id 唯一性编号 Cache 缓存策略编号,引用自Cache标签 State ...