《常见密码算法总结--(1)分组对称密码》见
[url]http://bbs.pediy.com/showthread.php?t=113921[/url]
[url]http://blog.csdn.net/NJZhuJinhua/archive/2010/05/27/5629455.aspx[/url]
《常见密码算法总结--(2)分组密码加密模式》见
[url]http://bbs.pediy.com/showthread.php?t=114169[/url]
[url]http://blog.csdn.net/NJZhuJinhua/archive/2010/05/30/5635313.aspx[/url]
NJZhuJinhua@csdn May.30, 2010
转载请注明出处。
(三)加密模式的openssl代码分析
openssl(本文所用openssl代码为1.0.0版本,2010.03.29发布。http://www.openssl.org 本文所用的内容最近几年应该未有更新,因而版本似乎也没多少关系)代码中crypto/modes目录下提供了cbc128,cfb128,ctr128,cts128,ofb128模式的实现。modes.h提供接口声明,其余诸文件分别提供了各种模式。
我们按照cbc,cfb,ofb的顺序进行介绍。
(1)CRYPTO_cbc128_encrypt CRYPTO_cbc128_decrypt
该函数在libeay32的实现中被
seed_cbc.c(SEED_cbc_encrypt())
cts128.c(CRYPTO_cts128_encrypt_block())
cmll_cbc.c(Camellia_cbc_encrypt())
aes_cbc.c(AES_cbc_encrypt())
所使用。
例如aes_cbc.c中:
AES的加解密公用一个函数,具体是加密还是解密通过参数enc指示。AES_cbc_encrypt通过将参数原封不动粗韩给CRYPTO_cbc128_encrypt或者CRYPTO_cbc128_encrypt完成加解密。最后一个回调函数AES_encrypt和AES_descrypt即使用该模式的加密算法,用于加密一个分组。
其他模式也基本同这例子,后面的模式不再详细说明其怎么跟加密算法的结合。
(2)CRYPTO_cfb128_encrypt CRYPTO_cfb128_1_encrypt CRYPTO_cfb128_8_encrypt
这三个实现了cfb模式的三种制式。其函数声明见上文描述。
这三种均被seed_cfb.c cmll_cfb.c aes_cfb.c引用。
在aes_cfb.c内使用情况如下:
void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, int *num, const int enc) {
CRYPTO_cfb128_encrypt(in,out,length,key,ivec,num,enc,(block128_f)AES_encrypt);
}
/* N.B. This expects the input to be packed, MS bit first */
void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, int *num, const int enc)
{
CRYPTO_cfb128_1_encrypt(in,out,length,key,ivec,num,enc,(block128_f)AES_encrypt);
}
void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, int *num, const int enc)
{
CRYPTO_cfb128_8_encrypt(in,out,length,key,ivec,num,enc,(block128_f)AES_encrypt);
}