分组密码模式: OFB模式(输出反馈模式)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分组密码模式: OFB模式(输出反馈模式)相关的知识,希望对你有一定的参考价值。

在OFB模式中,密码算法的输出会反馈到密码算法的输入中,OFB模式并不是通过密码算法对明文直接加密,而是通过将明文分组和密码算法的输出进行XOR来产生密文分组,在这一点上OFB模式和CFB模式非常相似,如下图所示:

技术分享

OFB模式和CFB模式的区别仅仅在于密码算法的输入,CFB模式中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,OFB模式中,密码算法的输入则是密码算法的前一个输出,也就是将输出反馈给密码算法,将一个分组抽出来对CFB模式和OFB模式进行一个对比,就可以很容易看出它们的差异:

技术分享

 

OFB模式的优点:

1. 隐藏了明文模式
2. 分组密码转化为流模式
3. 可以及时加密传送小于分组的数据

 

OFB模式的缺点: 

1. 不利于并行计算
2. 对明文的主动攻击是可能的
3. 误差传送:一个明文单元损坏影响多个单元

 

OFB模式的加密:

#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        当前明文分组数据
*           lpszKeyStream   当前密码算法的输出
*           lpszXorData     保存异或后的数据
*
*返回值:    
**************************************************************************/
void XorData(IN const char *lpszData, IN const char *lpszKeyStream, OUT char *lpszXorData)
{
    int i = 0;
    for (i = 0; i < 4; i++)
    {
        lpszXorData[i] = lpszData[i] ^ lpszKeyStream[i];
    }
}

int main(int argc, char* argv[])
{
    char szData[] = "Hello World!";
    char szEnData[16] = {0};
    char szDeData[16] = {0};
    char *lpszKey = "1234";
    int i = 0;
    char szIV[] = "9999";
    
    printf("原始数据: %s\\r\\n", szData);
    
    while (true)
    {
        if (strlen(szData + i) == 0)
        {
            break;
        }

        //密码算法的输出
        Encrypt(szIV, lpszKey, szIV);

        //明文分组与密码算法的输出做XOR
        XorData(szData + i, szIV, szEnData + i);
        
        i += 4;
    }
    
    printf("加密后数据: %s\\r\\n", szEnData);
    
    memcpy(szIV, "9999", 4);
    
    i = 0;
    
    while (true)
    {
        if (strlen(szEnData + i) == 0)
        {
            break;
        }
        
        //密码算法的输出
        Encrypt(szIV, lpszKey, szIV);

        //密文分组与密码算法的输出做XOR
        XorData(szEnData + i, szIV, szDeData + i);
        
        i += 4;
    }
    
    printf("解密后数据: %s\\r\\n", szDeData);
    
    return 0;
}

原始数据: Hello World!
加密后数据: @nfaVnVzgn,
解密后数据: Hello World!

以上是关于分组密码模式: OFB模式(输出反馈模式)的主要内容,如果未能解决你的问题,请参考以下文章

tplinkdes解密失败

分组密码模式: CTR模式(计数器模式)

ofb

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

《图解密码技术》Chapter4:分组密码的主要模式

分组密码模式: CFB模式(密文反馈模式)