DES加密算法应用:分组加密模式
通常,大多数的分组加密算法都是把数据按照64位分组的方式进行加密和解密。但是几乎所有的加密工作所涉及的数据量都远远大于64位,因此就需要不断地重复加密过程,直到处理完所有的分组。这种分组加密中所涉及的重复性方式称为分组加密模式。
处理多个数据分组最简单的方式是将每一个生成的密文分组添加到之前生成的密文分组之后。这种简单的方式被称为ECB,或者电子码本(electronic code book)。这种方法的简单性使其比较流行,但它相对来说是不安全的。主要问题是,对于任意给定的密钥,相同的明文分组加密之后得到的密文结果总是一样的,即明文和密文的分组是一一对应的关系。假如黑客破解了哪怕一小段数据,他就可以以此建立一个密码本,来对其他数据段进行破解。
一种更好的方法是CBC或被称为密码分组链接的模式。
CBC模式通过对分组密码增加简单的操作和反馈避免ECB中出现的问题。反馈使得密文的每个分组都同之前执行的操作在一定程度上有依赖关系(ECB中每个分组的加密和解密都是独立的)。在CBC模式中,用之前的密文分组作为反馈,这样就算是明文中的同一个分组,每次都好像加密成另一个不同的密文分组一样。
对于之前作为反馈的密文分组,在加密一个明文分组前,将前一个输出的密文分组与该明文分组求异或,然后再加密。
当解密时,将前一个输出的明文分组同接下来待解密的密文分组求异或,然后再解密。这两种方式可以简单的表示为:
Ci = Ek(Pi ⊕ 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加密算法应用:分组加密模式的更多相关文章
- 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码
JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...
- 实现五种分组加密模式ECB,CBC,CFB,OFB,CTR
没什么好说的,简单无脑! #include<iostream>using namespace std; int ECB(){ int duan[4]; int messageLen = 1 ...
- 数据加密算法--详解DES加密算法原理与实现
DES算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一.DES是对称的,也就是说它使用同一个密钥来加密和解密数据. DES还是一种分组加密算法,该算法每 ...
- 浅谈DES加密算法
一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...
- DES加密模式详解
DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...
- 分组加密的四种模式(ECB、CBC、CFB、OFB)
加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption).对称加密又分为分组加密和序列密码.分组密码,也叫块加密(bl ...
- go加密算法:CBC对称加密(一)--DES
package main import ( "bytes" //"crypto/aes" "crypto/cipher" "cry ...
- DES算法与四种加密模式的代码实现(C++语言)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Love_Irelia97/article/ ...
- Aes加密算法加密模式介绍
本文转自:https://www.jianshu.com/p/582d3a47729a AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中 ...
随机推荐
- css 选择器基础
有时在看别人代码时,看到一长串的选择器经常有点懵,今天来夯实一下基础 选择器有: 1.标签选择器 :就是HTML 中的标签 如<p> <h1> <body>等 2. ...
- linux、shell一些操作指令
1.cd $(dirname $0) shell脚本里面添加这个命令就可以进入此sh目录下,不用写绝对路径 2.strMac=`ifconfig eth0 | grep "HWaddr& ...
- 同事搭一个测试RAC说节点2发现idle了,报ORA-00304
[oracle@testrac2 11204]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Jan 16 1 ...
- 从0到1打造自己的VOIP网络电话系统(基于FreePBX)
从0到1打造自己的网络电话系统 最近流量卡越来越便宜了,看看自己手里的"坑不死老用户"的联通卡,顿时感觉到深深的恶意,但是iPhone没有双卡功能,所以只好自己动手打造一个网络电话 ...
- [Swift-2019力扣杯春季决赛]4. 有效子数组的数目
给定一个整数数组 A,返回满足下面条件的 非空.连续 子数组的数目: 子数组中,最左侧的元素不大于其他元素. 示例 1: 输入:[1,4,2,5,3] 输出:11 解释:有 11 个有效子数组,分别是 ...
- SignalR使用笔记
最近项目要求添加一个给用户发送消息的功能,就决定使用SignalR.翻到了以前学习SignalR的学习笔记,基本是官方文档的简版整理,便于快速阅览和实现. 1. nuget添加signalr引用: a ...
- Litepal【开源数据库ORM框架】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 好用的数据库框架. 效果图 代码分析 本篇主要是整理Litepal的引入和增删改查的简单操作,具体使用请阅读参考资料. 使用步骤 一 ...
- django插入数据库错误:mysql的1267错误
错误信息: django.db.utils.OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci,IM ...
- 多元线性回归公式推导及R语言实现
多元线性回归 多元线性回归模型 实际中有很多问题是一个因变量与多个自变量成线性相关,我们可以用一个多元线性回归方程来表示. 为了方便计算,我们将上式写成矩阵形式: Y = XW 假设自变量维度为N W ...
- 强化学习(二)马尔科夫决策过程(MDP)
在强化学习(一)模型基础中,我们讲到了强化学习模型的8个基本要素.但是仅凭这些要素还是无法使用强化学习来帮助我们解决问题的, 在讲到模型训练前,模型的简化也很重要,这一篇主要就是讲如何利用马尔科夫决策 ...