ECB模式详解

ECB模式(电子密码本模式)

在ECB模式中,将明文分组加密之后的结果直接作为密文分组,缺点是会容易攻击,因为明文相同的密文相同

概念
ECB(Electronic Codebook,电码本)模式是分组密码的一种最基本的工作模式。在该模式下,待处理信息被分为大小合适的分组,然后分别对每一分组独立进行加密或解密处理。如下图所示:
我们可以将其理解为是一个巨大的"明文分组→密文分组"的对应表
ECB模式详解
ECB模式下的加解密过程

ECB模式的优缺点

编辑
ECB模式作为一种基本工作模式,具有操作简单,易于实现的特点。同时由于其分组的独立性,利于实现并行处理,并且能很好地防止误差传播。
另一方面由于所有分组的加密方式一致,明文中的重复内容会在密文中有所体现,因此难以抵抗统计分析攻击。
因此,ECB模式一般只适用于小数据量的字符信息的安全性保护,例如**保护。


ECB模式优点:

1. 简单

2. 有利于并行计算

3. 误差不会被传送

 

ECB模式缺点:

1. 不能隐藏明文的模式

2. 可能对明文进行主动攻击

 

对ECB模式的攻击,截图来源自图解密码技术一书:

ECB模式详解

ECB模式详解

 

ECB模式的加密:

ECB模式详解
#include <STRING.H>

#define IN
#define OUT

//假设加密分组为4字节一组

/**************************************************************************
*功  能:    加密算法 (与Key异或)
*参  数:    lpszData        当前明文分组数据
*           lpszKey         Key    
*           lpszDeData      加密后的结果
*
*返回值:    
**************************************************************************/
void Encrypt(IN const char *lpszData, IN const char *lpszKey, OUT char *lpszEnData)
{
    int i = 0;
    for (i = 0; i < 4; i++)
    {
        lpszEnData[i] = lpszData[i] ^ lpszKey[i];
    }
}

/**************************************************************************
*功  能:    解密算法 (再次异或还原明文)
*参  数:    lpszData        当前密文分组数据
*           lpszKey         Key    
*           lpszDeData      解密后的结果
*
*返回值:    
**************************************************************************/
void Decrypt(IN const char *lpszData, IN const char *lpszKey, OUT char *lpszDeData)
{
    int i = 0;
    for (i = 0; i < 4; i++)
    {
        lpszDeData[i] = lpszData[i] ^ lpszKey[i];
    }
}

int main(int argc, char* argv[])
{
    char *lpszData = "Hello World!";
    char szEnData[16] = {0};
    char szDeData[16] = {0};
    char *lpszKey = "1234";
    int i = 0;
    
    printf("原始数据: %s\r\n", lpszData);
    
    while (true)
    {
        if (strlen(lpszData + i) == 0)
        {
            break;
        }
        
        Encrypt(lpszData + i, lpszKey, szEnData + i);
        i += 4;
    }
    
    printf("加密后数据: %s\r\n", szEnData);
    
    i = 0;
    while (true)
    {
        if (strlen(szEnData + i) == 0)
        {
            break;
        }
        
        Decrypt(szEnData + i, lpszKey, szDeData + i);
        i += 4;
    }
    
    printf("解密后数据: %s\r\n", szDeData);
    
    return 0;
}
ECB模式详解

原数据: Hello World!

加密后: yW_X^d[C^W

解密后: Hello World!