通常,大多数的分组加密算法都是把数据按照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. 前端css

    CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 CSS实例 ...

  2. Activity简介

    声明周期 4种状态 running / paused / stopped / killed 声明周期 activity启动  --->onCreate() -->onStart()---& ...

  3. python3 变量理解 解释器理解 常量理解 用户交互理解 逻辑运算

    先来条NLP再说...... 九,每人都已经具备使自己快乐的资源 每一个人都有过成功快乐的体验,也即是说有使自己快乐的能力. 人类只用了大脑能力极少部分,提升大脑的运用,很多新的突破便会出现. 运用大 ...

  4. 理解Linux文档的默认安全机制、隐藏属性、特殊权限,妈妈在也不用担心你从删库到跑路!!!

    写在前面 前面的章节 详解Linux文档属性.拥有者.群组.权限.差异,介绍了文档的基本权限,包括读写执行(r,w,x),还有文档若干的属性,包括是否为目录(d).文件(-).链接文件(l).拥有者. ...

  5. softmax函数详解

    答案来自专栏:机器学习算法与自然语言处理 详解softmax函数以及相关求导过程 这几天学习了一下softmax激活函数,以及它的梯度求导过程,整理一下便于分享和交流. softmax函数 softm ...

  6. eShopOnContainers 知多少[3]:Identity microservice

    首先感谢晓晨Master和EdisonChou的审稿!也感谢正在阅读的您! 引言 通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问.那进行 API 级别信任决策的第一步就是身份认 ...

  7. JNI实战(四):C 调用 Java

    在前面我们讲了一下如何使用Java调用C,本文我们讲一下如何使用JNI提供的接口来反射得到Java方法进行调用. 主要步骤如下: FindClass (找到Java层的类) GetMethodID / ...

  8. 中国IT史上两大严重事故对我们的警醒及预防措施

    20190121 一,历史回顾:20150528携程运维大事故 2015年5月28日上午11点开始,携程旅行网官方网站突然显示404错误页,App也无法使用,业务彻底中断. 据称是因为乌云网公布了携程 ...

  9. 使用dom4j 解析xml文件

    //使用dom4j 解析xml文件,升级版,dom4j是对dom的封装 //重点 package com.offcn.utils; import java.io.File; import java.i ...

  10. 批量执行工具PSSH详解

    批量执行工具PSSH详解 pssh是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,使用必须在各个服务器上配置好密钥认证访问. 安装pssh包 yum 安 ...