通常,大多数的分组加密算法都是把数据按照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. 简单几步用纯CSS3实现3D翻转效果

    作为前端开发人员的必修课,CSS3翻转能带我们完成许多基本动效,本期我们将用CSS3实现hover翻转效果~ 第一步非常简单,我们简单画1个演示方块,为其 添加transition和transform ...

  2. Abnormal build process termination--解决IDEA启动web项目报错

    iDEA启动后报Error:Abnormal build process terminatio 报错的原因如下: Error:Abnormal build process termination: & ...

  3. 如何快速掌握DDT数据驱动测试?

    1.前言 (网盗概念^-^)相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离, 这样的测试脚本设计模式称为数据驱动.(网盗结束)当我们测试某个网站的登录功能时,我们往往会使用不同的用 ...

  4. ERROR 1129 (HY000): mysqladmin flush-hosts

    mysql报错:ERROR 1129 (HY000): Host * is blocked because of many connection errors; unblock with 'mysql ...

  5. 微软推出了Cloud Native Application Bundles和开源ONNX Runtime

    微软的Microsoft Connect(); 2018年的开发者大会 对Azure和IoT Edge服务进行了大量更新; Windows Presentation Foundation,Window ...

  6. .NET微服务调查结果

    .NET Core就是专门针对模块化的微服务架构而设计, 在2018年国庆时间展开.NET微服务的使用情况,本次调查我们总计收到了来自378个开发者的调查.从落地现状.架构体系.未来趋势等方面对微服务 ...

  7. H5直播避坑指南

    本文来自"小时光茶社(Tech Teahouse)"公众号 作者简介: 文赫,2015年加入腾讯,作为前端开发工程师参与过手Q游戏公会,游戏中心,企鹅电竞等项目,具有丰富的移动端开 ...

  8. 【死磕Java并发】-----Java内存模型之happens-before

    在上篇博客([死磕Java并发]-–深入分析volatile的实现原理)LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题.那么我们正确使用同步.锁的情况下 ...

  9. mysql之聚合函数、group by、having

    sql中提供聚合函数可以用来统计,求和,求最值等 那么聚合函数有哪些呢? COUNT    统计行数量 SUM         求某一列的和 AVG          求某一列的平均值 MAX  求某 ...

  10. Java服务使用Redis实现分布式全局唯一标识

    此处以SpringBoot为例,示范如何使用Redis构造全局唯一标识. 1. RedisTemplate配置 spring.redis.database = 0 spring.redis.host ...