DES部分的编码,和AES有明显的不同,作者应该不是同一个人。
显卡一下类型的定义:
定义了参与计算的数据类型,其实就是字符数组。
typedef unsigned char DES_cblock[8];
这个定义很有意思,把const修饰符去掉了,原因是gcc2.8.1 在Solaris上会有问题。
/* With "const", gcc 2.8.1 on Solaris thinks that DES_cblock *
* and const_DES_cblock * are incompatible pointer types. */
接下来看一下对DES key的定义,我们都知道DES的密钥是8个字节,在这个定义中,通过Union方式,不仅定义了8个字节的数据,同时也定义了2个DES_long型的数据,这个DES_long类型,在32位机器上,应该是4个字节。
typedef struct DES_ks
{
union
{
DES_cblock cblock;
/* make sure things are correct size on machines with
* 8 byte longs */
DES_LONG deslong[2];
} ks[16];
} DES_key_schedule;
const char *DES_options(void);
返回DES算法的选项,包括: PTR, ptr 或者idx, risc是risc1,risc2,cisc, unroll是2或者6, 定义DES_LONG的类型是int还是long;
void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
DES_key_schedule *ks1,DES_key_schedule *ks2,
DES_key_schedule *ks3, int enc);
3DES ECB算法;
input: 输入数据
output: 输出数据
ks1,ks2,ks3, 3DES算法的三只密钥,实际应用中,大家更习惯于用两只密钥,调用此函数时,只需在ks3处传入ks1即可;
enc:加密:DES_ENCRYPT , 解密:DES_DECRYPT
DES_LONG DES_cbc_cksum(const unsigned char *input,DES_cblock *output,
long length,DES_key_schedule *schedule,
const_DES_cblock *ivec);
DES CBC模式的checksum计算;
input:输入数据;
output:输出数据;
length: 数据长度;
schedule: 密钥;
ivec: 做cbc的初始化向量数据;
返回值: checksum结果
/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */
void DES_cbc_encrypt(const unsigned char *input,unsigned char *output,
long length,DES_key_schedule *schedule,DES_cblock *ivec,
int enc);
void DES_ncbc_encrypt(const unsigned char *input,unsigned char *output,
long length,DES_key_schedule *schedule,DES_cblock *ivec,
int enc);
上面这两个函数都是对数据做DES CBC加密,区别是加密/解密操作完成之后,ivec是否被更新。
注意,这里面有个很费解的地方,DES_cbc_encrypt函数不更新ivec,DES_ncbc_encrypt更新ivec。
input: 输入数据;
output: 输出数据;
length: 数据长度;
schedule:密钥;
ivec: 初始化向量;
enc:DES_ENCRYPT , 解密:DES_DECRYPT;
void DES_xcbc_encrypt(const unsigned char *input,unsigned char *output,
long length,DES_key_schedule *schedule,DES_cblock *ivec,
const_DES_cblock *inw,const_DES_cblock *outw,int enc);
DES_xcbc_encrypt算法,除了ivec初始化向量,还有一个inw向量做为初始化向量的数据,outw是输出最后一块数据的结果;
input: 输入数据;
output: 输出数据;
length:数据长度;
schedule: 密钥;
ivec: 初始化向量;
inw:初始化向量数据;
outw:输出数据;
enc:DES_ENCRYPT , 解密:DES_DECRYPT;
void DES_cfb_encrypt(const unsigned char *in,unsigned char *out,int numbits,
long length,DES_key_schedule *schedule,DES_cblock *ivec,
int enc);
DES CFB模式计算。
in: 输入数据;
out: 输出数据;
numbits: CFB位数;
length: 数据长度;
ivec: 初始化向量数据;
enc:DES_ENCRYPT , 解密:DES_DECRYPT;
void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output,
DES_key_schedule *ks,int enc);
DES ECB计算;
input: 输入数据;
output: 输出数据;
ks: 密钥;
enc:DES_ENCRYPT , 解密:DES_DECRYPT;
void DES_encrypt1(DES_LONG *data,DES_key_schedule *ks, int enc);
DES计算,是内部函数,库函数调用此函数,库中其他函数负责从long×数据转化成char×,负责判断内存数据是否对齐等等,在用户程序中,应该尽量避免直接调用此函数;
data: 输入数据/ 输出数据;
ks: 密钥;
enc:DES_ENCRYPT , 解密:DES_DECRYPT;
void DES_encrypt2(DES_LONG *data,DES_key_schedule *ks, int enc);
此函数同样是内部函数,与DES_encrypt2相同,但是不包括IP,FP计算,库函数中3DES算法实现调用此函数;
IP() DES_encrypt2() DES_encrypt2() DES_encrypt2() FP() 这一序列调用,与DES_encrypt1() DES_encrypt1() DES_encrypt1() 相同,但是速度更快;
void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1,
DES_key_schedule *ks2, DES_key_schedule *ks3);
3DES加密算法,库函数调用,不推荐用户直接使用;
void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1,
DES_key_schedule *ks2, DES_key_schedule *ks3);
3DES解密算法,库函数调用,不推荐用户之间使用;
void DES_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output,
long length,
DES_key_schedule *ks1,DES_key_schedule *ks2,
DES_key_schedule *ks3,DES_cblock *ivec,int enc);
3DES CBC模式计算;
input: 输入数据;
output: 输出数据;
length: 长度;
ks1:密钥1;
ks2:密钥2;
ks3:密钥3;
ivec:初始化向量;
enc:DES_ENCRYPT , 解密:DES_DECRYPT;
void DES_ede3_cbcm_encrypt(const unsigned char *in,unsigned char *out,
long length,
DES_key_schedule *ks1,DES_key_schedule *ks2,
DES_key_schedule *ks3,
DES_cblock *ivec1,DES_cblock *ivec2,
int enc);
3DES CBCM模式计算;
input: 输入数据;
output: 输出数据;
length: 长度;
ks1:密钥1;
ks2:密钥2;
ks3:密钥3;
ivec1:初始化向量;
ivec2:加密/解密后的参与异或的向量数据;
enc:DES_ENCRYPT , 解密:DES_DECRYPT;
void DES_ede3_cfb64_encrypt(const unsigned char *in,unsigned char *out,
long length,DES_key_schedule *ks1,
DES_key_schedule *ks2,DES_key_schedule *ks3,
DES_cblock *ivec,int *num,int enc);
3DES CFB64位模式计算;
void DES_ede3_cfb_encrypt(const unsigned char *in,unsigned char *out,
int numbits,long length,DES_key_schedule *ks1,
DES_key_schedule *ks2,DES_key_schedule *ks3,
DES_cblock *ivec,int enc);
3DES CFB模式, numbits定义了多少位数;
void DES_ede3_ofb64_encrypt(const unsigned char *in,unsigned char *out,
long length,DES_key_schedule *ks1,
DES_key_schedule *ks2,DES_key_schedule *ks3,
DES_cblock *ivec,int *num);
3DES OFB64位模式;