码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-25 00:28:30      阅读:5823      评论:0      收藏:0      [点我收藏+]

标签:

在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模式(输出反馈模式)

标签:

原文地址:http://www.cnblogs.com/dacainiao/p/5525364.html

(2)
(2)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!