分组密码模式: CBC模式(密码分组链接模式)

  categories:资料  author:

块加密

块加密,英文Block Cyper,又称分组加密,是一种常见的对称加密,具有代表性的块加密有DES,AES,3DES等。块加密的工作模式允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。

 

CBC模式是将前一个密文分组与当前明文分组的内容混合起来进行加密的,这样就可以避免ECB模式的弱点。

在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密,如下图所示:

c1

如果将一个分组的加密过程分离出来,我们就可以很容易地比较出ECB模式和CBC模式的区别,ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR,如下图所示:

c2

 

当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量,通常缩写为IV。

 

CBC模式优点:

1. 不容易主动攻击, 安全性好于ECB, 适合传输长度长的报文, 是SSL、IPSec的标准

 

CBC模式缺点:

1. 不利于并行计算
2. 误差传递
3. 需要初始化向量IV

 

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

c3

 

c5

CBC模式的加密:

#include <STRING.H>

#define IN
#define OUT

//假设加密分组为4字节一组

/**************************************************************************
*功  能:    加密算法 (与Key异或)
阅读全文

ZipKin的原理的介绍

  categories:资料  author:

结构概述
  跟踪器(Tracers)存在在你的应用程序中生存,记录时间和关于操作的元数据。他们经常使用库,因此他们的使用对用户是透明的。例如,当它收到一个请求并发送一个响应时,一个感应器(instrumented )的web服务器记录。所收集的跟踪数据称为Span。

  在生产过程中,instrumention是安全的,并且没有太多的开销。由于这个原因,他们只在带内(in-band)传播id,告诉接收方有一个正在进行中的跟踪。完成的跨度被报告给Zipkin的“外带(out-of-band)”,类似于应用程序如何异步地报告指标。

  例如,当一个操作被跟踪,它需要发出一个传出的http请求时,会添加几个头来传播IDs。header不用于发送诸如操作名称之类的细节。

  将数据发送给Zipkin的应用程序的一种组件被称为Reporter。记者(Reporters)通过几个传输器(transports )中的一个传输跟踪数据到Zipkin收集器(collectors),这些收集器将跟踪数据保存到存储(storage)中。稍后,通过API查询存储,以向UI提供数据。

  下面是一个描述这个流程的图表:

  Zipkin architecture           

  要查看一个工具库是否已经存在于您的平台上,请参见清单

  existing instrumentations.

  示例流

 正如在概述中提到的,标识符被发送到带,而细节则被发送到Zipkin。在这两种情况下,跟踪工具都负责创建有效的跟踪并正确地呈现它们。例如,一个跟踪程序确保了它在带(下游)和带外(异步)的数据之间的奇偶性。

  下面是http跟踪的一个示例序列,其中用户代码调用资源/foo。这就产生了一个单一的Span,在用户代码收到http响应后,异步发送给Zipkin。

   

跟踪工具报告的范围是异步的,以防止延迟或故障与跟踪系统延迟或中断用户代码有关。

  Transport

   由测试库发送的数据(Spans)必须从追踪到Zipkin的collectors的服务中传输。有三种主要的传输方式:HTTP、Kafka和Scribe。

  Components  

 

  • collector
  • storage
  • search
  • web UI

 

  Zipkin Collector

    一旦跟踪数据到达了Zipkin Collector守护程序,就会被Zipkin的收集器进行验证、存储和索引。

  Storage

    Zipkin最初是为了存储Zipkin的数据而建立的,因为Cassandra是可扩展的,有一个灵活的模式,在Twitter上被大量使用。但是,我们使这个组件可插拔。除了Cassandra之外,我们还支持弹性搜索和MySQL。其他的后端可以作为第三方扩展来提供。

 Zipkin Query Service阅读全文

android x86安装

  categories:资料  author:

Android x86 即运行于 x86 PC上的Android操作系统,目前已经支持大部分安卓程序。Android X86平台是由Beyounn和Cwhuang主持设计的。项目的主要目的在于为X86平台提供一套完整的Android 系统解决方案。这个项目提供了一套完整的可行源代码树,配套文档以及Live CD与Live USB。

软件名称 Android x86 开发商 Google 软件平台 Android x86 PC 软件版本 Android x86 7.1 更新时间 2017- 软件语言 Linux

Android x86版在部分机型上网本上已经趋于完美,但在其他机型的兼容性适配上还有很长的路要走。另外随着 Intel 对 Android 向x86系统移植的进一步深入,Android x86 计划也在日趋完善。
跑分
2013年12月,Google Android开发团队公布了Ice Cream Sandwich (Android … 阅读全文

Android MotionEvent详解

  categories:资料  author:

在前边几篇博文中(《图解Android事件传递之ViewGroup篇》,《图解Android事件传递之View篇》),我们已经了解了android触摸事件传递机制,接着我们再来研究一下与触摸事件传递相关的几个比较重要的类,比如MotionEvent。我们今天就来详细说明一下这个类的各方面用法。

事件坐标的含义

我们都知道,每个触摸事件都代表用户在屏幕上的一个动作,而每个动作必定有其发生的位置。在MotionEvent中就有一系列与标触摸事件发生位置相关的函数:

  • getX()getY():由这两个函数获得的x,y值是相对的坐标值,相对于消费这个事件的视图的左上点的坐标。
  • getRawX()getRawY():有这两个函数获得的x,y值是绝对坐标,是相对于屏幕的。
    在之前的文章中,我们曾经分析过事件如何通过层层分发,最终到达消费它的视图手中。其中ViewGroupdispatchTransformedTouchEvent函数有如下一段代码:
    final float offsetX = mScrollX - child.mLeft;
    final float offsetY = mScrollY - child.mTop;
    event.offsetLocation(offsetX, offsetY);
    handled = child.dispatchTouchEvent(event);
    event.offsetLocation(-offsetX, 
阅读全文

关于MVC、MVP架构

  categories:资料  author:

这里开始记录下来自己对MVC、MVP、MVVM这三种框架模式的理解,本文从以下几个方面来梳理。

 

  • 架构的目的
  • 框架模式、设计模式
  • MVC设计的介绍
  • MVC在Android中的应用
  • MVC该如何设计
  • MVP设计的介绍
  • MVP在Android中的应用

1. 架构的目的

当我们在进行OOP编程时,一切对象来源于需求,对象结合业务逻辑通过多态、继承、等封装成各个业务模块。我们通过设计将程序模块化,使模块内部高内聚和模块之间低耦合。这样做的好处是,当我们进行开发或者测试时,我们只需要专注于一点,而不用考虑牵一发动全身之类的问题,从而大大提高了我们的工作效率。但是设计是服务于目的的,就是说我们的需求决定着设计,不同的场景有些不同的需求,那么其应用的设计模式必然是不尽相同的。万不可为了设计而设计,导致忘记了设计的初衷。
我们举个例子,假使我们的程序只需要实现一个极其简单的功能以至于只有寥寥数行代码,那这时候去考虑引入设计模式是不切实际的。但相反,对于系列庞大、功能众多的app我们就必须考虑引入一套符合情景的模式以梳理开发、简化维护。


2. 框架、设计模式

框架和设计模式是完全的两个概念,框架通常是代码的重用,而设计模式是设计的重用,架构则介于两者之间,部分代码重用,部分设计重用。
可能以上说法比较晦涩难懂,在此摘录一些从业者对它们的理解。

  • 框架通常是代码重用,模式是设计重用;
  • 设计模式是思考的过程,框架是思考的结果;
  • 框架需要用到设计模式,比如我们封装了一套retrofit+okhttp+rxjava网络请求框架,我们可能用到很多设计模式。比如:代理模式、观察者模式等;
  • 脱离实际需求谈框架都是耍流氓。
  • 框架是面包、面条、饺子…,设计模式是做面包面条饺子的手艺(至于怎么做、做成什么形状、味道…主要看手艺);
  • 设计模式是大量场景总结出来的模版,如果你有相应的场景就可以往上套。

我们今天谈到的MVX系列是框架而不是设计模式,因为MVX框架是用来解决实际需求的(比如View、Model如何分离相互控制)。


3. MVC设计的介绍

这里写图片描述

MVC的全称是Model View Controller,如图是模型(model)-视图(view)-控制器(controller)的缩写。一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。


4. MVC在Android中的应用

这里写图片描述

我们在文章的最开始说了框架的作用就是为了解决代码的臃肿,提高代码的复用率。在MVC模式中我们可以发现View、Model层都是遵循此原则设计的。
对于View层来讲,我们通常在做一个项目时封装出许多自定义控件或者动画,封装较好的情况下在别的项目中我们可以直接拿来用,这是View层代码复用的体现。
对于Model层呢?我们可以讲Model理解为用来存储业务数据,当我们的同一app需要跨平台时(比如腾讯视频的apk版和腾讯云极光TV版)我们考虑是不是Model可以共用?
对于Controller层来讲,几乎不可复用,因为它和业务逻辑联系太紧密。下面我们就来谈谈MVC在Android中的体现。

上图为MVC模式在Android项目中的体现,View代表视图层,Controller代表控制器,Model代表数据模型,app通过View视图监听控件根据控件表现调用相应的控制器处理业务逻辑,业务逻辑处理完之后控制器通知Model层改变,Model层改变带动View视图变化。
在android中一般采用xml文件进行界面描述,这些xml文件可以视为app的View层,引用很简单,并且通过良好构造也能达到一定的复用性。model对应着各种体现业务逻辑的数据类,它们体现了app的数据(对数据库、网络操作)。而联通它们之间的桥梁就是Controller即Activity、Fragment,我们通过在activity/fragment来管理控制整个业务流程。

这里举个例子来形象地阐述下MVC在Android中的应用,比如一个饭店的做饭流程,做饭就要考虑做什么?拿什么做?这其中是如何分工的。饭店老板戚总就好比我们的Controller,饭店的厨师老范相当于View(买什么菜他说了算是需求的来源),采购小王相当于Model。厨师老范需要做个霸王别姬,需要一大堆食材,他把需求报告给戚总,戚总整理成清单要求小王去采购,小王采购完成后直接将食材交给厨师老范。这就是MVC的一个循环,当然饭店比较小,有的时候厨师老范只需要一根葱这时候没必要专门让采购跑一趟了吧也省点油钱,戚总顺手就买了,时间久了,戚总慢慢干了点采购的活…

我们举个简单的例子。根据学生号码查询其名字、性别、年龄。… 阅读全文

LayoutInflater布局服务

  categories:资料  author:

 本节继续带来的是Android系统服务中的LayoutInflater(布局服务),说到布局,大家第一时间 可能想起的是写完一个布局的xml,然后调用Activity的setContentView()加载布局,然后把他显示 到屏幕上是吧~其实这个底层走的还是这个LayoutInflater,用的Android内置的Pull解析器来解析 布局。一般在Android动态加载布局或者添加控件用得较多,本节我们就来学习下他在实际开发中 的一些用法~

官方API文档:LayoutInflater


1.LayoutInflater的相关介绍


1)Layout是什么鬼?

答:一个用于加载布局的系统服务,就是实例化与Layout XML文件对应的View对象,不能直接使用, 需要通过getLayoutInflater( )方法或getSystemService( )方法来获得与当前Context绑定的 LayoutInflater实例!


2)LayoutInflater的用法

①获取LayoutInflater实例的三种方法

LayoutInflater inflater1 = LayoutInflater.from(this);  
LayoutInflater inflater2 = getLayoutInflater();  
LayoutInflater inflater3 = (
阅读全文

Android ListView ArrayAdapter 的简单使用

  categories:资料  author:

ArrayAdapter一个具体的BaseAdapter能支持任意数组对象,在默认情况下这类预期提供的资源id引用的是一个TextView.如果你想使用一个更复杂的布局,使用构造函数也需要一个字段id,该字段id应该引用一个TextView在更大的布局资源。然而对TextView的引用,他会对数组里的每个对象进行toString()方法,你可以添加自定义对象的列表或者数组,覆盖你的对象的toString()方法来确定将显示在项目列表中的文本。用一些除了TextView的控件显示数组,例如ImageView,或者有一些数据除了toString()填充视图,需要覆盖getView()返回你想要的类型。

public class ArrayAdapter<T> extends BaseAdapter implements Filterable {} 继承了BaseAdapter 可以调用其中存在的一些属性方法。实现了Filterable,这里不对其做过多的解释。

构造函数:

1、public ArrayAdapter(Context context, int textViewResourceId) {
init(context, textViewResourceId, 0, new ArrayList<T>());
}

2、  public ArrayAdapter(Context context, int resource, int textViewResourceId) {
init(context, resource, textViewResourceId, new ArrayList<T>());
}

3、 … 阅读全文

Android启动Activity的两种方式与四种启动模式

  categories:资料  author:

1、在一个Activity中调用startActivity()方法

2、在一个Activity中调用startActivityRequest()方法。

重写onActivityResult方法,用来接收B回传的数据。在B中回传数据时采用setResult方法,并且之后要调用finish方法。

第一种方法简单直接。但是如果A调用B,并传递数据,同时B对数据处理后又返回给A,A再将数据显示出来。碰到这种情况,用第一种方法需要在A的onCreate()里面判断是第一次生成的界面,还是由B打开的A。这样比较麻烦,用第二种方法就简单了,在A的onCreate()只用写一次生成的界面的内容。在A的onActivityResult方法里放B处理完数据后的内容就可以了。

下面是第二中方法的具体讲解:

package com.example.thestudystartactivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
    public TextView tv_activityA, tv_activityB, tv_activityC;

    @Override
    protected void onCreate(Bundle 
阅读全文

从锦囊妙计想到的05–循环结构介绍

  categories:儿童计算机, 原创  author:

知识回顾

重要的事情多说几遍,这样小朋友才能多学会点。

1. 计算机就是个小白痴, 你告诉他一句, 他就做一句, 你没了指示他就 蒙了,  你给计算机的每一句都是指示和命令,这些简称就是指令。 到底啥是计算机, 通俗点, 就是执行你安排给他的指令的机器, 就是计算机(不是特别准确)

2. 这个小白痴, 也有优点, 就是做的快, 你的命令一旦下达, 他能用非常非常快的  速度执行完成, 然后继续等待你的指示(指令, 命令, 锦囊  等等词都可以)

3. 这些指令(命令, 锦囊)要预先安排好, 按照一定方式组织到一起, 然后计算机就可以按照一定的顺序(可以是锦囊里面 指示下一个锦囊在哪里, 或者是那个锦囊)进行执行。  这些预先搞定的锦囊 其实就是一个程序, 程序是啥?  程序就是一系列的指令(就是锦囊)。

4. 计算机在快, 也需要时间, 因此程序执行是需要一定的时间的。 正在执行中的 … 阅读全文

使用ViewPager实现三个fragment切换

  categories:资料  author:

一、ViewPager的基本用法

1.ViewPager概述

ViewPager是android扩展包v4包中的类,这个类可以让我们左右切换当前的view。我们先来聊聊ViewPager的几个相关知识点:

  • ViewPager类直接继承了ViewGroup类,因此它一个容器类,可以添加其他的view类
  • ViewPager类需要一个PagerAdapter适配器类给它提供数据(这点跟ListView一样需要数据适配器Adater)
  • ViewPager经常和Fragment一起使用,并且官方还提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用

2.ViewPager使用案例

我们只需在xml布局文件中添加如下代码:
activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </
阅读全文



快乐成长 每天进步一点点      京ICP备18032580号-1