现在的位置: 首页 > 综合 > 正文

Openssl Des – 1

2017年11月11日 ⁄ 综合 ⁄ 共 4583字 ⁄ 字号 评论关闭

DES部分的编码,和AES有明显的不同,作者应该不是同一个人。

显卡一下类型的定义:

定义了参与计算的数据类型,其实就是字符数组。

typedef unsigned char DES_cblock[8];

这个定义很有意思,把const修饰符去掉了,原因是gcc2.8.1 在Solaris上会有问题。

typedef /* const */ unsigned char const_DES_cblock[8];
/* 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位模式;

【上篇】
【下篇】

抱歉!评论已关闭.