常见密码算法总结--(3)加密模式的openssl代码分析之cbc模式

  


《常见密码算法总结--(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);
}

 

阅读更多
个人分类: 密码学与网络安全
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭