源码文件:/evp/evp_enc.c
EVP_CIPHER_CTX ctx;
加密函数说明:
1、EVP_CIPHER_CTX_init(&ctx)
把ctx清0
2、EVP_EncryptInit_ex(&ctx, EVP_rc4(), NULL, key, NULL);
初始化ctx
2.1、ctx->encrypt = enc;设置ctx为加密或者解密
2.2、ctx->cipher = cipher;设置ctx的加密算法为EVP_rc4()
2.3、ctx->cipher_data = OPENSSL_malloc(ctx->cipher->ctx_size);开辟算法的私有数据空间,并赋值给ctx,这个私有数据一般是秘钥,在这里是EVP_RC4_KEY。
2.4、根据算法设置ctx的其它一些成员
ctx->key_len = cipher->key_len;
ctx->flags = 0;
2.5、ctx->cipher->init(ctx, key, iv, enc) 把key设置到2.3所分配的cipher_data中
2.6、最后设置一些ctx成员
ctx->buf_len = 0;
ctx->final_used = 0;
ctx->block_mask = ctx->cipher->block_size - 1; 加密块掩码用例检测要加密的数据是否是各算法块大小的整数倍
3、EVP_EncryptUpdate()
3.1、如果要加密的数据大小是算法块大小的整数倍执行如下的if分支。直接调用EVP算法加密函数进行加密
if (ctx->buf_len == 0 && (inl & (ctx->block_mask)) == 0) {
*outl = 0;
if (ctx->cipher->do_cipher(ctx, out, in, inl)) {
*outl = inl;
return 1;
} else {
}*outl = 0;
return 0;
}
3.2、如果要加密的数据大小不是算法块大小的整数倍,先只加密块大小最大整数倍大小的数据。
i = inl & (bl - 1); //计算要加密的数据大小除以块大小的余数
inl -= i;//要加密的数据最后不够块大小的数据暂时不加密
if (inl > 0) {
if (!ctx->cipher->do_cipher(ctx, out, in, inl))
return 0;
*outl += inl;
}
3.3、memcpy(ctx->buf, &(in[inl]), i);把剩余不够块大小没加密完的数据存到ctx里面
ctx->buf_len = i; 没加密完的数据大小也记录下来,在EVP_EncryptFinal_ex会用