3.3.1 DES 算法函数接口
在 OpenSSL 中 ,DES 算法的基本函数就是 ECB 操作模式对应的函数DES_ecb_encrypt() 。该函数把一个8 字节明文分组input 加密成为一个8 字节密文分组output 。参数中密钥结构ks 是用函数DES_set_key() 准备好的,而密钥key 是用随机数算法产生的64 个随机比特。参数enc 指示是加密还是解密。该函数每次只加密一个分组,因此用来加密很多数据时并不方便。
void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output, DES_key_schedule *ks,int enc);
int DES_set_key(const_DES_cblock *key,DES_key_schedule *schedule);
DES 算法CBC 操作模式加解密函数是DES_ncbc_encrypt() 。参数length 指示输入字节长度。如果长度不是8 字节的倍数,则会被用0 填充到8 字节倍数。因此,输出可能比length 长,而且必然是8 字节的倍数。
void DES_ncbc_encrypt(const unsigned char *input,unsigned char *output, long length, DES_key_schedule *schedule, DES_cblock *ivec, int enc);
DES 算法CFB 操作模式加解密函数是DES_cfb_encrypt() 。参数length 指示输入字节长度。参数numbits 则指示了CFB 每次循环加密多少明文比特,也即密文反馈的比特数目。ivec 是初始向量,被看做第0 个密文分组,是不用保密但应随机取值的8 个字节。如果在一次会话中数次调用DES_cfb_encrypt() ,则应该记忆ivec 。由于CFB 模式中每次DES 基本操作只加密numbits 比特明文,因此如果numbits 太小则效率太低。
void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, long length, DES_key_schedule *schedule, DES_cblock *ivec, int enc);
另有一个numbit 是64 比特的版本,既高效又没有填充的麻烦,推荐使用。num 中的返回值指示了ivec 中的状态,是和下次调用衔接的。
void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length, DES_key_schedule *schedule, DES_cblock *ivec, int *num, int enc) ;
OFB 和CFB 类似,也有两个函数,用法一样。
void DES_ofb_encrypt(const unsigned char *in,unsigned char *out,int numbits,long length,DES_key_schedule *schedule,DES_cblock *ivec);
void DES_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length,DES_key_schedule *schedule,DES_cblock *ivec,int *num);
3.3.2 A ES 算法函数接口
典型参数的AES 的基本操作是把128 比特明文在128 比特密钥指引下加密成128 比特密文。OpenSSL 中关于AES 的函数名和参数接口和DES 的雷同。相关函数名如下( 参数略) 。
int AES_set_encrypt_key();
int AES_set_decrypt_key();
void AES_ecb_encrypt();
void AES_cbc_encrypt();
void AES_cfb128_encrypt();
void AES_ofb128_encrypt();
3.3.3 RC4 算法函数接口
RC4 密码算法是流算法,也叫序列算法。流算法是从密钥作为种子产生密钥流,明文比特流和密钥流异或即加密。RC4 算法由于算法简洁,速度极快,密钥长度可变,而且也没有填充的麻烦,因此在很多场合值得大力推荐。
OpenSSL 中RC4 算法有两个函数: RC4_set_key() 设置密钥,RC4() 加解密。可以把RC4 看作异或,因此加密两次即解密。
void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata, unsigned char *outdata);