精华内容
下载资源
问答
  • 在学习别人的源代码或者整理自己的成果时,将类的方法转换流程图保存下来非常有利于理清思路,但是我一直没找到免费又好用的源代码直接生成流程图的软件,所以只好自己尝试写个程序完成自动转换。我主要用java写...

    在学习别人的源代码或者整理自己的成果时,将类的方法转换成流程图保存下来非常有利于理清思路,但是我一直没找到免费又好用的源代码直接生成流程图的软件,所以只好自己尝试写个程序完成自动转换。

    我主要用java写代码,Eclipse的JDT可以将java编译单元转换成抽象语法树,我想,在这个抽象语法树的基础上将方法源代码转换成dot脚本,再利用graphviz,应当可以完成这个目标。以下就是源代码。

    /**

    * 流程图节点类

    * @author 华硕

    *

    */

    public class DotNode {

    private int id;//节点的id,dot文件中作为节点的唯一标识

    private String text;//将显示在节点框中的内容

    private String shape;//节点的形状,只用了4种,单圆开始,双圆结束,普通四方,判断菱形

    private List preIds;//接到节点的id

    private Map edgeLabels;//指向本节点的边的标签

    public DotNode(){

    this.text = "";

    this.shape = "record";

    this.preIds = new ArrayList<>();;

    this.edgeLabels = new HashMap<>();

    }

    public int getId() {

    return id;

    }

    public void setId(int id) {

    this.id = id;

    }

    public String getText() {

    return text;

    }

    public void setText(String text) {

    this.text = text;

    }

    public String getShape() {

    return shape;

    }

    public void setShape(String shape) {

    this.shape = shape;

    }

    public List getPreIds() {

    return preIds;

    }

    public void setPreIds(List preIds) {

    this.preIds = preIds;

    }

    public Map getEdgeLbls(){

    return this.edgeLabels;

    }

    public String getEdgeLbl(int key){

    return edgeLabels.get(key) == null ? "" : edgeLabels.get(key);

    }

    public void setEdgeLbl(Integer preId, String label){

    edgeLabels.put(preId, label);

    }

    /**

    * 在switch语句的case条件中,简单添加switch标志语句作为前导节点

    * @param preId

    */

    public void addPreId(int preId){

    boolean exist = false;

    for(int pid : preIds){

    if(preId == pid){

    exist = true;

    break;

    }

    }

    if(!exist){

    preIds.add(preId);

    }

    }

    /**

    * 添加前导节点,如前导节点为判断节点,则设置边的标记为no

    * @param list

    * @param preId

    */

    public void addPreId(List list, int preId){

    boolean exist = false;

    for(int pid : preIds){

    if(preId == pid){

    exist = true;

    break;

    }

    }

    if(!exist){

    /*if(preIds.size() == 0){

    level++;

    for(DotNode node : list){

    if(node.getPreIds().contains(id)){

    node.setLevel(node.getLevel() + 1);

    }

    }

    }*/

    preIds.add(preId);

    DotNode pre = getDotNode(list, preId);

    if(pre != null){

    if(pre.getShape().equals("diamond") && getEdgeLbl(preId).equals("")){

    setEdgeLbl(preId, "no");

    }

    }

    }

    }

    /**

    * 在结点链表中查找指定id的节点

    * @param list

    * @param id

    * @return

    */

    public static DotNode getDotNode(List list, int id){

    for(DotNode d : list){

    if(d.getId() == id){

    return d;

    }

    }

    return null;

    }

    /**

    * 将toAdd合并到dest中,过滤掉重复的节点

    * @param dest

    * @param toAdd

    */

    public static void listAdd(List dest, List toAdd){

    if(toAdd == null){

    return;

    }

    if(dest == null){

    dest = new ArrayList<>();

    }

    for(DotNode addNode : toAdd){

    boolean exist = false;

    for(DotNode node : dest){

    if(addNode.getId() == node.getId()){

    exist = true;

    break;

    }

    }

    if(!exist){

    dest.add(addNode);

    }

    }

    }

    public static void listAdd(List destList, DotNode node){

    if(node == null){

    return;

    }

    if(destList == null){

    destList = new ArrayList<>();

    }

    boolean exist = false;

    for(DotNode d1 : destList){

    if(node.getId() == d1.getId()){

    exist = true;

    break;

    }

    }

    if(!exist){

    destList.add(node);

    }

    }

    }

    人打赏

    0人 点赞

    主帖获得的天涯分:0

    举报 |

    楼主

    |

    楼主发言:11次 发图:2张 | 添加到话题 |

    展开全文
  • 1、程序程序设计语言的基本知识1)程序:为解决某一问题而采用程序设计语言编写的一个...3)程序设计语言---按发展过程分类(1)机器语言 由一连串的0和1二进制代码组成,能被计算机直接理解和执行的指令集合。 ...

    1、程序与程序设计语言的基本知识

    1)程序:为解决某一问题而采用程序设计语言编写的一个指令集合。

    程序=算法(对操作的描述)+数据结构(对数据的描述)+程序设计语言+语言工具和环境。

    2)程序的特点:目的性、有序性、分步性、有限性、操作性。

    3)程序设计语言---按发展过程分类

    (1)机器语言

    由一连串的0和1二进制代码组成,能被计算机直接理解和执行的指令集合。

    指令格式:

    操作码操作数

    (2)汇编语言

    使用“助词符”来表示指令的操作码,使用存储单元或寄存器的名字表示地址码。

    可读性好,易查错,方便修改,占存储空间少,执行速度快。

    (3)高级语言

    与机器指令系统无关,独立于机器的程序设计语言,所使用的符号接近人类的自然语言,表达形式接近于被描述的问题。

    高级程序设计语言分类:

    面向过程的语言:程序不仅要说明做什么,还要详细说明如何做,程序需要详细描述解题的过程和细节;目的在于高效的实现各种算法。

    面向问题的语言:又称为非过程化语言或第四代语言,只需指出要计算机做什么、数据的输入和输出形式,就能得到所需结果;目的在于高效、直接地实现各种应用系统。

    面向对象的语言:将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性和行为,形成类,通过继承和多态重用。

    4)翻译程序(编译器)

    (1)定义:其他编程语言必须经过一个翻译过程才能转换成机器语言,实现编译过程的工具是语言处理程序。

    (2)汇编程序

    定义:将汇编语言编制的程序(称源程序)翻译成机器语言程序(称目标程序)的工具。

    翻译工作的步骤:

    用机器操作码代替符号化的操作符。

    用数值地址代替符号名称。

    将常数翻译为机器的内部表示。

    分配指令和数据的存储单元。

    作用:

    f7e228e5376093db21d984b2c5b55f71.png

    (3)翻译程序

    定义:将高级语言编写的源程序翻译成目标程序的工具。

    工作方式:

    解释方式:解释程序

    解释程序对源程序逐条地解释执行,不产生目标代码,程序执行时,解释程序和源程序一起参加运行。

    4cbcf70c3c74b577ccfc4e3bed7fc656.png

    解释方式执行速度较慢的原因:

    每次运行需重新解释。

    若程序较大,且错误发生在程序后面,则前面的运行是无效的。

    解释程序只看到一句语句,无法对整个程序优化。

    编译方式:编译程序

    对整个源程序经过编译处理后,产生一个与源程序等价的目标程序。

    c571e74d062fdb902f9dab7ce208d021.png

    编译过程的六个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。

    5)程序设计语言的支持环境

    操作系统是各种软件的核心和基础,是整个系统的控制管理中心,为其他软件提供运行环境。

    10c8c998f6222abdd55100f5e897d910.png

    6)程序设计语言的基本成分和语法

    (1)程序的基本语法单位

    定义:程序是由语句构成的,而语句又是由数据、表达式、函数等基本语法单位组成的,构成表达式、函数等的最小单位是字符。

    字符集:

    定义:字符是构成程序设计语言的最小语法单位,每一种程序设计语言都有自己的合法字符集。

    基本字符集:数字:0-9

    字符:a-z,A-Z

    分隔符:,;

    运算符:+,-,*,/

    数据类型:

    定义:数据就是描述客观事物的数字、字符、图片等,即所有能输入到计算机中并能被计算机处理的符号的集合。

    分类:基本数据类型:程序设计语言系统内置的。

    特点:其值不可再分解。整数类型、实数类型、字符类型、逻辑类型等。

    构造数据类型:由基本数据类型按某种方式组合而成的。

    数组类型、记录类型、枚举类型、集合类型、字符类型、文件等。

    使用数据类型的目的:

    决定该类型数据的取值形式、范围和在计算机中的存储和表示方式。

    决定了该类型的数据所能执行的操作种类,即能够施加到不同类型数据上的运算是不同的。

    表达式:

    10c8c998f6222abdd55100f5e897d910.png

    定义:表达式由变量、常量、函数调用和运算符组成。

    常量和变量:数据存入内存→存放数据的内存单元命名→内存单元名来访问其中的数据

    常量:在程序运行中数据不变的量。

    变量:在程序运行中数据变化的量。

    变量在使用前必须声明其类型和名称,编译程序根据其数据类型,在内存中分配相应的存储空间,以存储该变量的值。

    运算符:

    算术运算:加减乘除和乘方。

    字符运算:连接、取子串

    关系运算:大于、大于等于、小于、小于等于、等于、不等于

    逻辑运算:与、或、非

    内部函数:按功能分为数学函数、字符串函数、日期函数、转换函数。

    赋值语句:表达式和赋值号构成了程序设计的一条赋值语句。

    (2)数据的输入和输出

    一类:程序之间以文件形式传送数据。

    二类:人机交互,将人们可以识别的形式按一定格式输入到程序的变量中,输出则相反,按用户的要求格式将变量或常量的值显示或打印。

    (3)基本控制结构

    顺序结构:指程序的执行按照语句出现的先后顺序一次执行。

    选择结构:根据条件判断,决定程序的执行顺序。

    循环结构:指重复执行某个操作。

    (4)过程:指重复处理的程序段或者分解的子功能编写成一个逻辑上独立的过程,当程序需要该过程时进行调用。

    2、算法的基本知识

    1)算法的描述:程序---计算机语言表述的算法。

    流程图---图形化的算法。

    2)计算机的算法

    (1)数值计算算法

    目的:求数值解。

    特点:少量输入、输出,复杂的运算。

    (2)非数值计算算法

    目的:对数据的处理。

    特点:大量输入、输出,简单的运算。

    3)算法的定义:是解决问题方法的精确描述,但算法并不给出问题的精确解,只是说明怎样才能得到解。

    4)算法的性质:有穷性、确定性、有效性、零个或多个输入、一个或多个输出

    5)算法=数据对象的运算和操作(算数运算、逻辑运算、关系运算、数据运算)+控制结构(顺序结构、选择结构、循环结构)。

    6)描述算法的方法

    (1)自然语言

    优点:通俗易懂

    缺点:易产生歧义,往往根据上下文才能判断其含义,不严格;语句繁琐、冗长,很难清楚地表达算法的逻辑流程。

    (2)流程图法

    定义:用图框、线条、文字说明,形象直观的描述算法。

    流程图符号:

    9177d6fd971d3d8edc90be801bbd079a.png

    ---起止框:表示流程的开始或结束。

    ac64db07adef0e713de03c409de9bfd2.png

    ---输入输出框:表示输入数据或输出结果。

    e3013b9a16252b42b78fc0e49234d7c4.png

    ---判断框:根据条件判断,决定算法的继续执行的走向。

    edf7c12ee49daa93c7359003f373b88c.png

    ---处理框:表示基本功能的处理的描述。

    538fb1bbc7b65cce6c7d5251d4d23810.png

    ---流程线:表示流程的路径和方向。

    7336bffa3572ab9dc919577e2c43d5e9.png

    ---连接点:表示流程中“向”和“来自”其他地点的输出或输入。

    (3)N-S流程图法:全部算法以一个大的矩形框表示,内包含一些从属于它的小矩形框。

    顺序语句:

    e9fb4cb430b71ed2c2c1d03af70cc741.png

    选择语句:

    a5c68b63ce3174ae94fea181aae5b3d2.png

    循环语句:

    d72b37b7aa459afcf484ab7862e391cb.png

    fcf2b7e3ce96445fbb8af0d3e9654a82.png

    (4)伪代码法:简称伪码,伪代码是介于自然语言和计算机语言之间的文字和符号来描述算法。

    7)算法评价

    (1)正确性:设计和评价算法的首要条件。

    (2)算法的时间特性:指依据算法编制成程序后在计算机中运作所耗费时间的长短。

    算法的时间复杂度:把程序中语句重复执行次数之和作为程序运行时的时间特性。

    (3)算法的空间特性:指依据算法编制成程序后在计算机中运行所占用空间的大小。

    算法的空间复杂度:在计算机上运行所占用的空间同样也是问题规模n的一个函数。

    (4)算法的易理解性。

    3、程序设计的过程。

    1)程序设计步骤

    383b7fa64d7adac3c555b4f9f7c8cdd9.png

    2)测试的前提:程序通过编译,没有语法和连接上的错误。

    3)测试用例:为了发现程序中的错误而设计的测试数据。

    4)黑盒测试:又称功能测试或数据驱动测试,不考虑程序的内部结构和处理过程,只对程序的接口进行测试,检查程序是否能适当地接受输入数据并产生正确的输出信息。

    黑盒测试技术有事务处理流程测试、等价类划分、边界值分析。

    5)白盒测试:又称结构测试或逻辑驱动测试,检验程序内部的逻辑来测试,检查程序中每条通路是否正确工作。

    百合测试有路径测试、语句测试、分支测试、条件组合测试。

    4、程序设计思路

    1)三种基本程序结构

    (1)顺序结构:

    特点:只有一个入口点和一个出口点。

    组成:说明语句、赋值语句、输入输出语句、子函数调用语句、返回语句。

    (2)选择结构:

    特点:程序的处理步骤出现分支,根据某一特定的条件选择其中的一个分支执行。

    形式:单选泽、双选择、多选择。

    (3)循环结构

    当型循环:先判断后执行。

    直到型循环:先执行后判断。

    2)结构化程序设计的基本思想

    采用“自顶向下,逐步求精”(基本原则)的程序设计方法,结构化设计以模块化设计为中心,每个模块各个击破,最后再统一组装。

    3)结构化程序设计的特征

    (1)以三种基本结构的组合来描述程序

    (2)整个程序采用模块化结构。

    (3)以控制结构为单位,每个结构只有一个入口一个出口,各单位之间接口简单,逻辑清晰。

    (4)采用结构化程序设计语言书写程序,并采用一定的书写格式使程序结构清晰,易于阅读。

    (5)注意程序设计风格。

    (6)有限制地使用转移语句,在非用不可的情况下,只限于在一个结构内部跳转,不允许从一个结构跳到另一个结构。

    4)良好的设计风格

    语句形式化、程序一致性、结构规范化、适当使用注释、标识符贴近实际。

    5)面对对象的基本概念

    (1)对象(object)---最简单的实体

    对现实世界中对象的模式化,是数据和代码的组合,具有自己的特征和行为。

    对象的特征用数据来表示,称属性。

    对象的行为用对象中的代码来实现,称为对象的方法。

    任何对象都由属性和方法组成的。

    将反映对象的属性和行为封装在一起,是面向对象编程的基本元素,是面向对象设计的核心。

    (2)类(class)

    类是创建对象实例的模板,是同种对象的集合与抽象,它包含所创建对象的属性描述和行为特征的定义,对象是类的实例。

    (3)属性(property)

    属性用来表示对象的特征,不同的对象有不同的属性。

    (4)方法(method)

    方法是对对象的属性的各种操作。

    (5)事件、事件过程和事件驱动

    事件是面向对象程序设计中对应于“消息”的术语。

    对象的事件是指系统事先设定的,能被对象识别和响应的动作。

    事件过程:应用程序处理事件的步骤。

    事件驱动的编程机制是程序执行后系统等待某个事件的发生,然后去执行处理此事件过程,待事件过程执行完后,系统又处于等待某事件发生的状态。

    (6)封装

    封装机制将数据和代码捆绑在一起,避免了外界的干扰和不确定性。一个对象就是一个封装了数据和操作这些数据的代码的逻辑实体,封装的目的在于将对象的使用者和对象的设计者分开。

    封装一方面通过数据抽象把相关的信息结合在一起,另一方面简化了接口。

    封装性可降低开发过程的复杂性,提高效率和质量,同时也保证了程序中数据的完整性和安全性。

    (7)继承

    继承是可以让某个类型的对象获得另一个类型的对象的属性的方法。

    (8)多态性

    多态机制使具有不同内部结构的对象可以共享相同的外部接口,虽然针对不同对象的具体操作不同,但通过一个公共类,他们可以通过相同的方式调用。

    优点:大大提高程序的抽象程度和简洁性,降低类和模块之间的耦合性,有利于程序的开发和维护。

    (9)消息传递

    6)OOP的基本过程

    (1)分析现实问题。

    (2)建立模型(类属性/方法的确定及类之间关系的确定)。

    (3)编程建立数据模型(属性、方法)。

    (4)用类声明对象,通过对象间传递信息(方法调用)完成预订功能。

    7)OOP的优点

    (1)通过继承,减少多余的代码并扩展现有代码。

    (2)在标准的模块上构建自己的程序,减少软件开发时间并提高生产效率。

    (3)数据隐藏---保护程序免受外部代码的侵袭。

    (4)允许一个对象的多个实例同时存在,彼此之间相互不干扰。

    (5)允许将问题空间中的对象直接映射到程序中。

    (6)基于对象的工程可以很容易地分割为独立部分。

    (7)以数据为中心的设计方法允许我们抓住可实现模型的更多细节。

    (8)面向对象的系统很容易从小到大逐步升级。

    (9)对象间通信所使用的消息传递技术与外部系统接口部分描述更简单。

    (10)便于控制软件复杂度。

    展开全文
  • 第一章 单元测试1、判断...选项:A:对B:错答案: 【对】4、判断题:C语言中,可以有多个主函数选项:A:对B:错答案: 【错】5、判断题:C程序从第一条语句开始执行,这条不一定是主函数的语句。选项:A:对B:错答案: 【...

    第一章 单元测试

    1、判断题:
    C语言允许直接访问物理地址
    选项:
    A:对
    B:错
    答案: 【对】

    2、判断题:
    C语言具有输入输出语句
    选项:
    A:对
    B:错
    答案: 【错】

    3、判断题:
    C语言的语句的最后必须加分号。
    选项:
    A:对
    B:错
    答案: 【对】

    4、判断题:
    C语言中,可以有多个主函数
    选项:
    A:对
    B:错
    答案: 【错】

    5、判断题:
    C程序从第一条语句开始执行,这条不一定是主函数的语句。
    选项:
    A:对
    B:错
    答案: 【错】

    6、判断题:
    函数是C程序的主要组成部分,编写C程序的主要工作就是编写一个个函数
    选项:
    A:对
    B:错
    答案: 【对】

    7、判断题:
    C程序中,注释部分是不执行的,因此是可有可无的。
    选项:
    A:对
    B:错
    答案: 【错】

    8、判断题:
    多个C语句可以写在同一行上
    选项:
    A:对
    B:错
    答案: 【对】

    9、判断题:
    C程序是面向对象的程序
    选项:
    A:对
    B:错
    答案: 【错】

    10、判断题:
    C语言具有可移植性好和硬件控制能力高的特点
    选项:
    A:对
    B:错
    答案: 【对】

    第二章 单元测试

    1、多选题:
    程序设计人员所应具备的知识包括
    选项:
    A:算法
    B:数据结构
    C:程序设计方法
    D:语言工具
    答案: 【算法;数据结构;程序设计方法;语言工具】

    2、判断题:
    算法是为解决某个问题而采取的方法和步骤
    选项:
    A:对
    B:错
    答案: 【对】

    3、单选题:
    表示一个算法的方法中,那种方法容易产生歧义
    选项:
    A:传统流程图
    B:自然语言
    C:结构化流程图
    D:伪代码
    答案: 【自然语言】

    4、多选题:
    三种基本结构包括
    选项:
    A:重构
    B:顺序
    C:选择
    D:循环
    答案: 【顺序;选择;循环】

    5、多选题:
    三种基本结构的特点包括
    选项:
    A:只有一个入口
    B:只有一个出口
    C:结构内的每部分都有机会执行到
    D:结构内不存在死循环
    答案: 【只有一个入口;只有一个出口;结构内的每部分都有机会执行到;结构内不存在死循环】

    6、判断题:
    由三种基本结构组成的顺序结构,可以解决任何复杂问题
    选项:
    A:对
    B:错
    答案: 【对】

    7、多选题:
    一个有效的算法应该具有以下特点
    选项:
    A:有穷性
    B:确定性
    C:有0个或者多个输入
    D:有1个或者多个输出
    E:有效性
    答案: 【有穷性;确定性;有0个或者多个输入;有1个或者多个输出;有效性】

    8、判断题:
    算法中的每个步骤必须是确定的,不能是含糊的
    选项:
    A:对
    B:错
    答案: 【对】

    9、判断题:
    有穷性指的是,只要操作步骤是有限的即可
    选项:
    A:对
    B:错
    答案: 【错】

    10、判断题:
    一个算法可以没有输入
    选项:
    A:对
    B:错
    答案: 【对】

    2d9716669bdf6bd58d6af198ef9e79a8.png

    展开全文
  • 原创:Porlock合天智汇01PaddingOracle Attack 原理剖析(一)PaddingOracle AttackPadding OracleAttack是在Eurocrypt2002大会上,Vaudenay所介绍的一种针对CBC模式的攻击方法。它可以在不知道密钥的情况下,通过对...

    cc7885924ae93e5b3fe4113c14112e47.png

    原创:Porlock合天智汇

    01PaddingOracle Attack 原理剖析

    (一)PaddingOracle Attack

    Padding OracleAttack是在Eurocrypt2002大会上,Vaudenay所介绍的一种针对CBC模式的攻击方法。它可以在不知道密钥的情况下,通过对paddingbytes的尝试,获取加密过程中的IntermediaryValue,从而还原明文或构造出任意明文的密文

    (二)加解密原理

    分组加密算法在实现加解密时,需要把消息进行分组,分组(block)的大小一般有64bit,128bit,256bit等。

    本文以CBC模式为例,对攻击原理进行简单的阐述。

    a74644b0cf100cf7ea8d90aa21adcb0f.png
    图一:CBC加密模式

    我们以8个字节一个block为例,首先将第一组的明文与初始iv进行异或之后进行相应的加密算法运算。计算完第一组后,将第一组获得的密文作为第二组的iv进行运算,如此类推,得到所有明文加密的结果。

    如果在这个加密的过程中,最后一个分组的消息长度(明文长度)没有达到block的大小,则需要对其填充一些字节(padding)。

    f6151bf318cb0d9ffc8d74bc16df950a.png
    图二 padding标准PKCS5

    上图padding例子使用现行最常见的padding标准PKCS#5。当需要填充1个字节时,填充值为0x01;当需要填充2个字节时,其填充值为0x02,0x02;当需要填充3个字节时,其填充值为0x03,0x03,0x03……

    4d47eea557e693a20146ecaf845ad051.png
    图三 CBC解密方式

    类似的,解密过程与加密过程类似。首先将第一分组的密文进行解密运算,之后与初始iv进行异或,得出对应的明文。计算完第一分组后,将第一分组的密文作为第二分组的iv参与运算,如此类推得到所有分组密文的解密结果。

    加解密原理大致阐述了一下,读者还记得上面提到的PaddingOracleAttack的特点吗?即在不知道密钥的情况下,还原明文或构造出任意明文的密文。所以下面请将注意力转移到解密部分,我们来仔细分析解密部分的一些特点,想办法做出PaddingOracle Attack的功能。

    (三)攻击原理

    在密钥一定的情况下,对密文进行解密算法运算,我们是可以得出一个与明文唯一对应的密文。在上文所说的解密过程中,进行解密算法运算只是每一组运算中的一个步骤,接下来是另一个步骤,即异或出结果。在这个过程中,使用解密算法运算得出的密文我们将其称为Intermediary Value。

    小结一:每组密文解密所得到的IntermediaryValue都是固定的(因为与明文唯一对应),而我们暂时不知道它的值(因为我们不知道密钥)

    接下来我们来分析异或部分

    329d6b5e1e06b7ee26afd6c7239ad40d.png
    图四 CBC解密细节

    可以看到,IntermediaryValue ⊕ iv = 明文。

    请再次仔细想一想,在不知道密钥的情况下,还原明文或构造出任意明文的密文。所以,我们可以认为明文已知。

    又因为Intermediary虽然未知,但是它的值是固定的,因此我们可以将上面这个表达式转换为

    明文 =Intermediary Value ⊕ iv

    所以,我们慢慢调整iv的值,以期得到与我们想要的明文一致的iv值,并一个字节一个字节的尝试,直到得出分组所使用的iv值。(iv每一个字节从0x00到0xFF进行尝试)

    小结二:通过上面的推断,我们已经获取到了iv和明文值

    继续看这个公式明文 = Intermediary Value ⊕ iv

    我们继续做一下转换

    Intermediary Value = 明文⊕ iv

    因为明文和iv都已知了,因此我们可以通过异或得到IntermediaryValue的值。IntermediaryValue已知,那么我们就可以通过IntermediaryValue ⊕ 我们想要的明文=> 得到对应的iv

    推导出最后一个分组使用的iv后,将此iv作为第一个分组的密文,再次进行推导,以此类推,便可以找到解密为任意明文的密文和iv对了

    总结:明文 =Intermediary Value ⊕ iv

    通过推导,我们可以得到解密为任意明文的密文和iv对,达成了既定目标。这里值得注意的是,需要对密文进行解密才能得出对应的IntermediaryValue,因此如果我们在没有密钥的情况下,需要通过一定的办法,触发app的解密程序,获取IntermediaryValue,从而继续我们上面对iv的推导。

    02PaddingOracle Attack 攻击实例(CTF题目)

    (一)题目来源

    常见的一道基础CBC翻转字节攻击

    (二)题目关键代码(伪代码)

    做题步骤

    * 1.源码泄露

    * 2.代码审计

    题目核心逻辑伪代码如下图所示

    11d70e10d2939eb731ef5a6f6fe08ca8.png
    图五 题目核心逻辑伪代码

    所以我们可以知道,考点在于使用服务器为用户设置的密文和iv,进行某些操作,使得密文解密后的用户名为admin

    (三)解题方法

    1.利用网上到处都是的CBC翻转字节攻击代码进行

    2.利用《白帽子讲web安全》内的PaddingOracle Attack的示例代码进行攻击(修改过的脚本代码附后)

    我们在这里使用第二种方法进行,由于存在源码泄露,我在源码中找到了加密密钥,因此我不需要对触发app的解密代码来获取IntermediaryValue。可以直接使用密钥进行解密运算,从而获取解题所需的密文和iv对。

    23d0525a19e39178a4a3ab4540452d14.png
    图六 攻击脚本运行结果

    获取到密文和iv对之后,我们替换掉原先设置的密文和iv对,即可getflag。

    3144f1459055fb19bf45164a83e88860.png
    图七 getflag截图

    (四)章节小结

    实际上这里取巧了,获得了题目加密的密钥。如果题目不能获取到密钥的话(实际攻击场景中常见),需要对脚本进行一些修改,触发攻击对象的解密程序,获取IntermediaryValue。

    03PaddingOracle Attack 脚本修改中的一些思考

    实际上写下这篇博文也是因为这个思考,最近所在的实验室办校内ctf比赛。作为客服的我无聊看了一下web题,又无意中突然发现题目的密钥长度没有达到算法预期,不禁产生了疑问。所以下面部分是对PHP的openssl_encrypt/openssl_decrypt中对key处理的研究

    (一)问题来源

    bb52fcca641b4c19aa5f4f6d6fa3e69a.png
    图八 问题来源

    (二)源码跟进分析

    83d19932cecd91e65c2744e4751477fb.png

    图九 openssl_encrypt()源代码

    可以看到,我们在使用openssl_encrypt函数时,输入的key(密钥)即是图中的参数password,而在第6624行中,密钥作为形参传到了一个名为"php_openssl_cipher_init"的函数中,我们继续跟进。

    efe6703b2b2e813d34a8476e6d23dfe7.png

    图十php_openssl_cipher_init( )源码

    可以看到在函数中的第6511和第6512两行中,分别获取了用户输入的密钥长度和加密算法对应的规定密钥长度,显然,我们想要找到处理就在这个地方,继续往下看。

    7690dc2b6d6c888f42fc5e4867d1aacc.png

    图十一 密钥处理部分分析

    图片上我加了注释,解释应该十分清晰了。

    (三)脚本修改

    6e235649aa766f72d629b9c0ec6fbbe9.png

    图十二 脚本修改

    根据上面得出的处理结果,对攻击脚本进行修改(主要增加密钥处理功能)

    相关操作学习:

    密码学原理:复制如下链接打开网页或者点击文末“阅读原文”,开始操作!

    http://www.hetianlab.com/cour.do?w=1&c=c990c65e-108f-4d10-9efa-4aad77fc852b

    0b0d4df7f6b6485db088b643542c6c40.png

    本文脚本源码:

    https://github.com/Porlockzzz/attackScript/blob/master/padding_oracle_attack.py

    本文为合天原创,未经允许,严禁转载。

    展开全文
  • 编写Ruby代码,并在流程图上查看方法交互。 与过程代码,裸方法和类一起使用。 这是实验性项目,并不支持所有类型的代码。 如果您希望它支持更多类型的代码,请提出要求。 安装 将此行添加到您的应用程序的Gemfile...
  • 前言这段时间小编在整理开发代码问题时发现开发同学在使用block时经常出现一些BUG,其中还有一些隐藏的很深的问题,这里小编就为大家介绍一下block的原理,简单用法和常见问题。Block概要Block:带有自动变量的匿名...
  • 另外“带有自动变量值的匿名函数”这一概念也并不仅指blocks,它还存在于其它许多程序语言中。其他语言中Block的名称: 其他语言中Block的名称2、闭包闭包 = 一个函数(或指向函数的指针) + 该函数执行的上下文变量...
  • 当我听到人们说Mathematica不够快的时候,我通常会提出想要看一下这段令他们烦恼的代码,然后会发现,其实并不是Mathematica本身的表现不够好,而是Mathematica没有被最优使用。我觉得我应该和大家分享一下我在优化...
  • 写在开头,这不是一篇广告文。 微信小程序横空出世,到现在已经有 4 年...小程序的诞生微信开了一个头微信并不是第一个做小程序的 App,而是做小程序最有优势的 App,比如高流量、用户较长的停留时间等等。站在微...
  • 微计算机应用 年 上可以很直观地与详细设计进行对照检测 检查正确无误后可以将单位长度乘以某一合适比例值将流程图打印出来形成 书面材料作为软件开发文档保存备查 参 考 文 献 张海藩软件工程导论北京清华大学出版...
  • 梳理需求---设计流程---设计原型---设计UI(用户界面)---编写代码---测试---上架APP软件定制开发的难点:解决用户的高并发(就是指怎么解决几万几十万用户同时访问服务器,而不至于让程序崩溃)逻辑难点(有些产品内部的...
  • 程序代码流程图的互转工具

    千次阅读 2018-06-02 11:11:00
    【前言】在深入软件白盒测试的过程中,程序流程图的存在感越发强烈。而手动从源代码转换为流程图的过程又是一项繁琐但并不复杂的过程,想必有很多自动化的方法来实现。 参考: 几款代码转流程图软件 ...
  • 流程图: 源代码: main public info1,info2,bufa,bufb,buf,main,info0,info3 extrn change1:far,change2:far,change3:far,change4:far data segment info0 db 0ah,0dh,'this is the change of letter to ...
  • Easystructure是一款免费软件,可以自动识别C语言源文件生成树视图并转换成简易流程图。 如果你是C语言初学者需要流程图辅助理解程序结构或者正饱受啥b老师的作业折磨,用这个软件就对了。 2. 下载 download_...
  • 程序设计流程图,简称程序框图,是用统一规定的符号描述一个专用程序运行...网站登录流程图程序流程图作用程序框图一般用来描述某一具体的活动或过程,描述在该活动中处理器的运行逻辑及步骤。当程序中有较多循环语...
  • Code::Blocks 使用技巧.7-代码流程图双向转换

    千次阅读 热门讨论 2010-09-19 19:49:00
    大学里学过好多程序流程图,好像是《软件工程》的课。基本都忘了,有次用visio画图,看到几张图,感觉有印象,才想起是大学里读过的。流程图是在结构化编程里确实比较有用,认真回忆起来,也确实曾经代码怎么写怎么...
  • 一、设计思想  先将参数个数输出,并利用循环结果将参数...二、程序流程图   三、源程序代码 package demo; public class CommandParameter {  /** * @param args */ public static void main(String[]...
  • 模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。 1、 设计思想 在命令行进行参数的转化并进行相加,输入两个...2、 流程图 3、 源程序代码 package demo; im...
  • 在进行类c语言到流程图转换时,首先通过词法分析、语法分析和语义分析生成XML代码,再进行统一解析生成流程图.在转换过程中实时进行错误检查,出现错误所在行会高亮显示以提示用户,并给出错误原因以便于用户修改程序....
  • 展开全部如果需要精确计算16和27的阶乘32313133353236313431303231363533e59b9ee7ad9431333361306332需要编写大整数计算,至少要实现大整数加法,大整数乘以短整数,大整数除以短整数,大整数转换为字符串用于显示...
  • Java多线程状态转换流程图,读懂此图,绝对会对多线程理解大大加深 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于...
  • 图形编辑器, 画图程序, 绘制, 设计, 打印, 矢量图转换, VC++, VB, 源代码 --全球领先, 100%采用高性能C++编写而成的企业级制图源码解决方案,100%源码开放!   使用E-Form++可视化...
  • 数码转换程序实验

    千次阅读 2019-01-01 22:27:31
    一、实验目的: 掌握不同进制数及编码相互转换程序设计方法。   二、实验环境: PC 微机一台、TD-PITD 实验系统一套。...转换过程的参考流程如图 2-3-2 所示,根据流程图编写程序代码。 十进制...
  • 一、Spark提交应用任务的四个阶段: 总共提交的任务分为四个阶段,提交+执行:1、在分配完毕executor以后,解析代码生成DAG有向无环;2、将生成的DAG提交给DAGScheduler,这个组件在driver内,DAGScheduler负责...
  • Python代码加密流程

    2019-09-20 05:16:21
    在计算机内部, Python解释器把源代码转换成字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行,这使得 Python程序更加易于移植。 一、对可执行exe程序进行保护 加壳工具主界面如: 开...
  • 编制一个完整的程序,将一字节压缩BCD码转换为两个ASCII码,并将结果存放在ASC和ASC+1单元,按高位存低地址、低位存高地址的格式存放。一字节压缩BCD码是两位0~9的数字,4位二进制数对应一位BCD码。所以关键是要将...
  • 代码是自然语言和类编程语言组成的混合结构。...描述可以使用自然语言、伪代码,也可使用程序流程图,但描述的结果必须满足算法的五个特征; 二、使用自然语言描述算法显然很有吸引力,但是自然语言固有的不...
  • 带有序列图和流程图支持HTML转换器降价。 生成包括图表的文档具有以下优点: 文档可以像源代码一样签入版本控制中,并且可以有效地比较更改,因为它们都是文本 使用绘图软件制作和更新图表很慢 它使用转换图表的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 549
精华内容 219
关键字:

代码转换程序流程图