分组密码模式: 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!

时间: 2024-10-14 00:41:41

分组密码模式: OFB模式(输出反馈模式)的相关文章

设计模式——介绍与工厂模式(扁平管理模式VS职业经理人模式)

本文主要对设计模式进行大概解说.特别是对工厂模式进行简明的解析: 一.设计模式的分类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.訪问者模式.中介者模式.解释器模式. 事实上还有两类:并发型模式和线程池模式. 二.设计模式的六大原则 1.开闭原则(Op

MVC+EF 理解和实现仓储模式和工作单元模式

MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generic Repository in ASP.NET MVC using Entity Framework 文章介绍 在这篇文章中,我们试着来理解Repository(下文简称仓储)和Unit of Work(下文简称工作单元)模式.同时我们使用ASP.NET MVC和Entity Framework 搭

JAVA的模式对话框和非模式对话框

周末的时候,一位网友让我帮他把他的无模式对话框改成有模式对话框. 界面是有swing制作的,都是JFrame,我从来没有接触过swing编程.大致的代码还是看的懂,很多都和C#很相似. 然后就去查资料,JAVA的模式对话框是如何调用的.终于查到了需要用到JDialog类,JDialog的构造函数里可以指定是否是模式对话框. 1 public JDialog(Frame owner, String title, boolean modal) { 2 super(owner == null? Swi

5 行为型模式之- 责任链模式

责任链模式介绍: 责任链模式是行为模式之一,什么是"链"?我们将多个节点首尾相连,就形成了链,对于链式结构,每个节点都可以拆开再重新连接,因此链式结构也具有很好的灵活性.将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从一个链的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式. 责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这

模式窗口和非模式窗口

JS弹出模式窗口 和非模式窗口JS弹出模式窗口 一般来说,显示在最前面的窗口都是因为被激活获得焦点,要是窗口永远显示在最前面, 可以人为的设置窗口在blur时立刻focus,或者用模式.无模式对话框实现. 具体步骤  方法一:弹出窗口<body>里加上代码:onblur="self.focus()":      <body onblur="self.focus()">  方法二:用showModelDialog方法简历模式对话框,他的参数说明

详解大端模式和小端模式

详解大端模式和小端模式 原文地址:http://blog.csdn.net/ce123_zhouwei/article/details/6971544 一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战.战争的原因:大家都知道,吃鸡蛋的时候,原始 的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,

CPU 实模式 保护模式 和虚拟8086模式

从80386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式.只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode.实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存.在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务

大端模式和小端模式的区别

大端模式和小端模式的区别 在C语言中除了8位的char型之外,还有16位的short型,32位的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题.因此就导致了大端存储模式和小端存储模式. 大端模式: 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中. 小端模式: 与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节. 例如,16位宽

文档模式与IE浏览器模式

一.IE浏览器的兼容性视图 兼容性视图是微软为了兼容基于其它网页标准开发的网站,确保广大互联网用户在浏览网页时不至于受困于网页显示混乱的问题,而专门为IE8增加的一项实用功能.当IE8检测到某网站不兼容时,地址栏右侧就会出现兼容性视图按钮,只需轻轻一点,大部分网页显示就会正常了.(网页会以IE7的代码规范来显示) 它引入重要的两个概念便是“浏览器模式”和“文档模式”: 注:也可按F12进入开发人员工具来查看当前页面的浏览器模式和文档模式 二.文档模式 指定IE页面排版引擎根据哪一个版本的方式来解

Java设计模式(一)普通工场模式,抽象工场模式

设计模式 设计模式我觉得是前人总结的,为了解决一类问题而总结的代码设计经验.最初可能为了使用而使用,后面就会发现,很多没想到的问题因为使用了正确的设计模式已经为你考虑到了.<design patterns设计模式>这本书是程序员进阶必学. (一)工厂模式 工厂模式的意义在于定义一个用于创建对象的接口,并控制返回哪个类的实例.网上比较流行的一个普通工厂模式的例子. interface Sender{ public void send(); } class MainSender implement