月度归档:2009 年二月

对称块加密算法加密模式详解[转]

标题:对称块加密算法加密模式详解
作者:DragonKing
Email: wzhah@263.net
原发网站:中国openssl专业论坛 http://openssl.126.com
版权声明:未经作者允许,不能转载和在出版物中使用本文

在openssl或其他密码相关的资料中,我们经常看到对称加密算法有ECB、CBC之类加密模式的简称,到底这些加密模式是什么呢?它们之间有什么不同呢,今天就是为大家解开这个迷。
在现有的对称加密算法中,主要有4种加密处理模式,这4种加密处理模式一般是针对块加密算法而言的,如DES算法。这4种加密模式罗列如下:

   模式中文描述            英文名称(Openssl缩写)
  电子密码本模式  Electronic Code Book(ECB)
   加密块链模式          Cipher Block Chaining(CBC)
   加密反馈模式          Cipher Feedback Mode(CFB)
   输出反馈模式          Output Feedback Mode(OFB)
  
下面我们分别介绍这4种加密模式。
【电子密码本模式】

种模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。比如DES算法,一个64
位的密钥,如果采用该模式加密,就是将要加密的数据分成每组64位的数据,如果最后一组不够64位,那么就补齐为64位,然后每组数据都采用DES算法的
64位密钥进行加密。下图:
_______________________
My name |is Drago|nKing
———————–
上图“My name is DragonKing”这句话每8个字符(64位)作为一块,然后使用一个相同的64位的密钥对每个块进行加密,最后一块不足64位,就补齐后再进行加密。
可以看到,因为ECB方式每64位使用的密钥都是相同的,所以非常容易获得密文进行密码破解,此外,因为每64位是相互独立的,有时候甚至不用破解密码,只要简单的将其中一块替换就可以达到黑客目的。
【加密块链模式】
该模式如下图所示:
            P0           P1                              C0            C1
            |               |                                  |              |
            |               |                                  |—-|        |—>…
IV—>XOR  |—>XOR  |—>…          Key Dec  |      Dec
            |      |        |      |                           |      |       |
            |      |        |      |                           |      |       |
  Key Enc     |     Enc    |               IV—>XOR  |—>XOR   
            |—–|        |—–|                          |               |    
            |               |                                 |               |
           C0           C1                               P1            P2
         加密过程                                      解密过程

从这两个图中大家可以看到,CBC模式的加密首先也是将明文分成固定长度(64位)的块(P0,P1…),然后将前面一个加密块输出的密文与下
一个要加密的明文块进行XOR(异或)操作计算,将计算结果再用密钥进行加密得到密文。第一明文块加密的时候,因为前面没有加密的密文,所以需要一个初始
化向量(IV)。跟ECB方式不一样,通过连接关系,使得密文跟明文不再是一一对应的关系,破解起来更困难,而且克服了只要简单调换密文块可能达到目的的
攻击。
但是该加密模式的缺点是不能实时解密,也就是说,必须等到每8个字节都接受到之后才能开始加密,否则就不能得到正确的结果。这在要求实时性比较高的时候就显得不合适了。所以才有了下面两种加密模式。
【加密反馈模式】
加密反馈模式为了克服必须等待8个字节全部得到才能进行解密的缺点,采用了一个64位(8个字节)的位移寄存器来获得密文,如下图所示:

      C2|C3|C4|C5|C6|C7|C8|C9<—|           C2|C3|C4|C5|C6|C7|C8|C9<—|
      ——————————-    |           ——————————-    |
                        |                        |                              |                       |
                        |                        |                              |                       |
           Key—>Enc                     |C10           Key—>Enc                    |C10
                        |                        |                              |                       |
                        |                        |                              |                       |
           取最左一个字节             |                取最左一个字节              |
                        |                        |                              |                       |
                        |                        |                              |                       |
         P10—>XOR—————–>C10         C10—>XOR—————-)—>P10
                                                                               |______________|
               加密过程                                               解密过程

上面两个图中C2、C3以及P10等都是一个字节(8位)的数据,所以能够实现字符的实时加密和解密,不用再等到8个字节都接受到之后再进行解密。
图示是在进行第10个字节数据的加密和解密过程,在该过程中,先从移位寄存器取8个字节的数据(C2到C9)用密钥进行加密,然后取加密数据最左边的一个
字节跟输入的明文P10进行XOR(异或)操作,得到的值作为输出密文C10,同时将C10送入到移位寄存器中。
需要注意的是,如果其中有一个字
节的密文在传输的时候发生错误(即使是其中的一位),那么它出现在移位寄存器期间解密的8个字节的数据都会得不到正确的解密结果,当然,这8个字节过去之
后,依然可以得到正确的解密结果。但是一个比特错误就影响到8个字节(64个比特)的正确结果,导致鲁棒性太差,所以就又提出了下面的加密模式OFB。
【输出反馈模式】
输出反馈模式OFB跟CFB几乎是一样的,除了其以为寄存器的输入数据稍微有一点不同之外,如下图:
      S2|S3|S4|S5|S6|S7|S8|S9<—-|          S2|S3|S4|S5|S6|S7|S8|S9<——|
      ——————————-    |           ——————————-    |
                        |                        |                              |                       |
                        |                        |                              |                       |
           Key—>Enc                     |S10           Key—>Enc                    |S10
                        |                        |                              |                       |
                        |                        |                              |                       |
           取最左一个字节             |                取最左一个字节              |
                        |______________|                              |_____________|
                        |                                                       |                       
         P10—>XOR—————–>C10         C10—>XOR——————->P10
                                                                                
               加密过程                                               解密过程

以看到,这种方法因为没有采用密文作为加密的数据,所以克服了由于传输过程中由于单个比特导致64个相关比特解密失败的情况,在本模式下,如果一个比特发
生错误了,那么只会影响其本身对应的一个比特,而不会影响别的。但是相对于其它模式,因为数据之间相关性小,这种加密模式是比较不安全的,所以在应用的时
候除非特别需要,一般不提倡应用OFB模式。

【参考资料】
1.中国openssl专业论坛 http://openssl.126.com
2.Computer Networks
3.《应用密码学》

【How to】如何安装Xdebug[转]

网上找到的一篇文章讲的很清楚,就直接Copy过来了,在此感谢原作者。 :razz:

xdebug是一个开源的php调试器,以php模块的形式加载并被使用。

windows 平台下:

一、安装xdebug模块
1、去www.xdebug.org下载相应版本php的模块文件,保存下载后的文件到php的ext目录,可以自己修改文件的名称,现在最新的版本是 2.0.1。
2、修改php.ini,增加如下信息

[Xdebug]
zend_extension_ts=”d:/php/ext/xdebug-xxx.dll”
xdebug.auto_trace=on
xdebug.collect_params=on
xdebug.collect_return=on
xdebug.trace_output_dir=”d:\Temp\xdebug”
xdebug.profiler_enable=on
xdebug.profiler_output_dir=”d:\Temp\xdebug”

参数解释:
zend_extension_ts=”d:/php/ext/xdebug-xxx.dll”
加载xdebug模块。这里不能用extension=xdebug-xxx.dll的方式加载,必须要以zend的方式加载,否则安装上后,
phpinfo打印出来的里的xdebug段的会有XDEBUG NOT LOADED AS ZEND EXTENSION的警告信息。

xdebug.auto_trace=on
自动打开“监测函数调用过程”的功模。该功能可以在你指定的目录中将函数调用的监测信息以文件的形式输出。此配置项的默认值为off。

xdebug.collect_params=on
打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。此配置项的默认值为off。

xdebug.collect_return=on
打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。此配置项的默认值为off。

xdebug.trace_output_dir=”d:\Temp\xdebug”
设定函数调用监测信息的输出文件的路径。

xdebug.profiler_enable=on
打开效能监测器。

xdebug.profiler_output_dir=”d:\Temp\xdebug”
设定效能监测信息输出文件的路径。

另外,xdebug 不能和 Zend Optimizer 以及其他 Zend 扩展 (DBG, APC, APD etc) 同时工作,目前这个问题正在修复中。

还有一些更为具体的参数设定,详见:http://www.xdebug.org/docs-settings.php

3、重启apache

这样,在本地运行php的时候,会在所设定的目录里产生一些调试信息的文件:

* 函数调用过程监测信息文件的文件名格式:trace.××××××.xt。这个文件可以直接查看,里面包含了函数运行的时间,函数调用的参数值,返回值,所在的文件和位置等信息。内容格式还是相对直观的。
* 效能监测文件的文件名格式:cachegrind.out.××××××××。
这个文件也可以直接查看,不过信息格式不易被人类所理解,
所以我们需要接下来的一个软件。

二、安装wincachegrind
由于效能监测文件:cachegrind.out.××××××××文件的内容不易被人类所理解,所以我们需要一个工具来读取它。windows下就有一款这样的软件:wincachegrind。
1、到http://sourceforge.net/projects/wincachegrind/下载安装wincachegrind
2、安装运行后,点击Tools->options,设定你的working folder(php.ini里xdebug.profiler_output_dir的值)
这样就可以比较直观的查看效能监测文件的信息了。

控制输出CacheGrind文件名的控制
http://xdebug.org/docs/all_settings#trace_output_name

ubuntu 下安装

一、安装xdebug
1. 先到xdebug.org下载最新的源码包。
2. 编译安装

tar -zxvf xdebug-xxx.tgz
cd xdebug-xxx
phpize
./configure –enable-xdebug
make
sudo make install

3. 修改配置文件php.ini,添加下面一行
zend_extension_ts=”/wherever/you/put/it/xdebug.so”
这里的/wherever/you/put/it/是 xdebug.so 所在的目录
第一行将装入 Xdebug 扩展;第二行将启用 Xdebug 的分析器功能,而第三行将启用扩展的调试功能。

一些推荐的配置

xdebug.default_enable = On
xdebug.profiler_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6
xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD, REQUEST_URI, HTTP_USER_AGENT

4. 重启apache,然后再phpinfo信息里就可以看到 Xdebug 的部分了。

二、安装 Debug client
1. 下载 Debug client
2. 解压缩源代码包,然后安装

cd debugclient
./configure –with-libedit
make
sudo make install

参考文章:
http://xdebug.org/docs/install
http://www.leeyupeng.com/?p=325
http://www.phpres.com/html/gaojiyingyong/20070921/1781.html

The words on 20090211

1.abandon vt 离弃,丢弃,放弃;
The pretty woman abandoned her husband and went away with all their money;
abandon oneself to 沉溺于;
with bandon 1.放任的,放纵的;2.纵情的

abandon,desert,quit
abandon指因外界压力或影响彻底舍弃所感兴趣的事物或人;desert指违背誓言或法定义务,含贬义;quit指突然放弃某份工作、习惯和作法,常指“停止”。

2.ability n.[能力,本领],[才能,才智]

e.g. Now,a momentous queston scientists face is how to use man’s growing ability to genetically alter DNA.现在,科学家面临的一个重要问题是如何利用人类不断增长的能力来从基因方面改组脱氧核糖核酸。

to the best of one’s ability,尽自己最大的努力

ability,capability,capacity

ability为普通用词,尤指做事的智力或体力,后面通常接不定式;capability也指智力和体力方面的“能力”,但既可用于人,也可用于物,且后面常接of或for;capacity主要指收容和生产的能力,也可指人内在的潜力,后面可接不定式of或for.

He soon received promotion, for his superiors realized that he was a man of considerable (A)

A.ability B.future C.possibility D.opportunity

[译文]不久,他就得到了提升,因为他的上司们认识到他的能力很强

使用Java来实现网络传输数据压缩的实例

1:选择或者创建一个新的套接字。(可以参看SUN´S的”创建一个典型的套接字”)。

2:创建一个服务器端的套接字

3:创建一个RMIClientSocketFactory

4:创建一个RMIServerSocketFactory

5:创建一个继承了UnicastRemoteObjec的远程对象,从而使用新的factories

根据这一大致的想法,我们来看每一步如何具体的实现。

步骤1: 创建ZipSocket

由于要进行Zip压缩,我们重新创建这样的套接字

import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import java.net.Socket;
public class ZipSocket extends Socket {
private InputStream in;
private OutputStream out;
public ZipSocket() { super(); }
public ZipSocket(String host, int port) throws IOException {
super(host, port);
}
public InputStream getInputStream() throws IOException {
if (in == null) {
in = new ZipInputStream(super.getInputStream());
}
return in;
}
public OutputStream getOutputStream() throws IOException {
if (out == null) {
out = new ZipOutputStream(super.getOutputStream());
}
return out;
}
public synchronized void close() throws IOException {
OutputStream o = getOutputStream();
o.flush();
super.close();
}
}

步骤2: 创建ZipServerSocket

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException
public class ZipServerSocket extends ServerSocket{
public ZipServerSocket(int port) throws IOException {
super(port);
}
public Socket accept() throws IOException {
Socket socket = new ZipSocket();
implAccept(socket);
return socket;
}
}

步骤3:创建ZipClientSocketFactory

客户端的factory的创建必须遵循以下的形式:

import java.io.IOException;
import java.io.Serializable;
import java.net.Socket;
import java.rmi.server.RMIClientSocketFactory;
public class ZipClientSocketFactory
implements RMIClientSocketFactory, Serializable {
public Socket createSocket(String host, int port) throws IOException {
ZipSocket socket = new ZipSocket(host, port);
return socket;
}
}

步骤4:创建ZipServerSocketFactory

import java.io.IOException;
import java.io.Serializable;
import java.net.ServerSocket;
import java.rmi.server.RMIServerSocketFactory;
public class ZipServerSocketFactory
implements RMIServerSocketFactory, Serializable {
public ServerSocket createServerSocket(int port) throws IOException {
ZipServerSocket server = new ZipServerSocket(port);
return server;
}
}

步骤5: 创建一个继承了UnicastRemoteObjec的远程对象,从而使用新的factories.

public class YourRMIObject extends UnicastRemoteObject {
public YourRemoteObject( int port ) {
super( port, new ZipClientSocketFactory(), new ZipServerSocketFactory() );
}
// 剩下的是你自己的程序实现
}

现在你的通信数据得到了压缩.

转自dics的博客