在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!
时间: 2024-10-14 00:41:41