您的位置:首页 > 其它

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

2016-05-23 23:27 375 查看
在CFB模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思,如下图所示:



在ECB模式和CBC模式中,明文分组都是通过密码算法就行加密的,而在CFB模式中,明文分组并没有通过密码算法来直接进行加密。

我们将CBC模式和CFB模式对比一下,就可以看出其中的差异了,在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤,而在CFB模式中,明文分组和密文分组之间只有XOR。



CFB模式的优点:

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

CFB模式的缺点:

1. 不利于并行计算
2. 误差传送:一个明文单元损坏影响多个单元
3. 唯一的IV

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





CFB模式的加密:

#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, szIV);

memcpy(szEnData + i, szIV, 4);

i += 4;
}

printf("加密后数据: %s\r\n", szEnData);

memcpy(szIV, "9999", 4);

i = 0;
char szPreEnData[8] = {0};

while (true)
{
if (strlen(szEnData + i) == 0)
{
break;
}

memcpy(szPreEnData, szEnData + i, 4);

//与前一个密文分组加密, 注意这里是加密, 而不是解密!!!!!!!!!!!!!!
Encrypt(szIV, lpszKey, szIV);

//与密文分组xor操作得到明文
XorData(szEnData + i, szIV, szDeData + i);

memcpy(szIV, szPreEnData, 4);

i += 4;
}

printf("解密后数据: %s\r\n", szDeData);

return 0;
}



原始数据: Hello World!
加密后数据: @nfa|:]"U/
解密后数据: Hello World!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: