DES加密的Python和PHP实现

先介绍Linux下加密库
1.Mcrypt
http://mcrypt.sourceforge.net/

2.OpenSSL

3.GnuPG

然后是Python实现
1. python-crypto 专门为python实现的加密库

2. python-m2crypto 对OpenSSL的封装
http://chandlerproject.org/Projects/MeTooCrypto

3. python-openssl 也是调用OpenSSL, 但主要用来处理https, ssl socket链接
http://pyopenssl.sourceforge.net/

4. python-pycryptopp 对Crypto++库的封装
http://allmydata.org/trac/pycryptopp

5. TLS Lite 纯python实现
实现了SSL 3.0 TLS 1.0/1.1, 可以访问OpenSSL, cryptlib, pycrypto 以及 GMPY
http://trevp.net/tlslite/

最后是 PHP 的实现
PHP Mcrypt库
这个实现 只支持Zero填充方法,不支持PKCS7/PKCS5 填充,也不支持Space填充

下面介绍几种填充模式
1.ANSIX923
ANSIX923 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充数字零。
假定块长度为8,数据长度为 9
数据: FF FF FF FF FF FF FF FF FF
X923 填充: FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07

2.ISO10126
ISO10126 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。
假定块长度为 8,数据长度为 9
数据: FF FF FF FF FF FF FF FF FF
ISO10126 填充: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07 (标下划线的是随机产生的)

3.PKCS7
PKCS #7 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。
假定块长度为 8,数据长度为 9,
数据: FF FF FF FF FF FF FF FF FF
PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
这种填充方法也叫PKCS5, 恰好8个字节时还要补8个字节的0x08

不同之处
在PKCS5Padding中,明确定义Block的大小是8个字节,而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间,填充值的算法都是一样的:
value = K – (L mod K) , K=块大小,L=数据长度,如果L=8, 则需要填充额外的8个byte的8
BlockSize = 64bits = 8bytes,在这种情况下在PKCS5Padding=PKCS7Padding

正是这种即使恰好是8个字节也需要再补充字节的规定,可以让解密的数据很确定无误的移除多余的字节。

4.Zeros
填充字符串由设置为零的字节组成。

OpenSSL的命令行的使用
$ openssl version
OpenSSL 0.9.8k 25 Mar 2009

$ echo “this is my secret dream” |openssl des-cbc -a  -k zhiwei -nosalt -iv 00
U2FsdGVkX1851oI652opuoQxX/PacRMn+6huMZIt9AdBsJr7NTR35/TqkhpiG4RZ

-a 参数 表示要将 密文 转换成 可打印的ascii码 (用的是base64的编码)
如果是解密,表述输入的数据,是用base64编码过的,必须先进行base64解码,才能进行解密
-d 参数 表示 解密
-k 表示 后面的 key,用字符串来表示Key
-K 表示用 十六进制来指定Key

-salt
use a salt in the key derivation routines. This option should ALWAYS be
used unless compatibility with previous versions of OpenSSL or SSLeay is
required. This option is only present on OpenSSL, Versions 0.9.5 or later.
-nosalt
do not use a salt in the key derivation routines. This is the default for
compatibility with previous versions of OpenSSL and SSLeay.

-iv IV
用十六进制表示的初始化向量。
只有当指定-K选项时,才必须指定IV,当口令用其他方式指定时,初始化向量从口令中生成

下面两个参数,可以用来查看加密使用的Key和初始化向量
-p 加密前,打印出使用的Key和IV

-P 只是打印出使用的Key和IV, 然后退出,并不加密

禁止块填充
-nopad 禁止标准块填充
        所有的块,一般使用PKCS#5 填充方法,也叫标准块 填充:执行 基本的完整性和口令检查。
    如果填充被 禁止,那么输入的数据必须 是加密块 长度的整数倍

发表评论

电子邮件地址不会被公开。 必填项已用*标注