openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)
openssl之EVP系列之5---EVP_Encrypt系列函数详细解释(二)
---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.doc部分翻译和自己的理解写成
(作者:DragonKing, Mail: wzhah@263.net ,公布于:http://gdwzh.126.com之openssl专业论坛,版本号:openssl-0.9.7)
前面的文章我们介绍了EVP_ENcrypt系列函数的基本部分,本文将介绍他们的一些扩充部分,即一些參数设置和其他辅助的函数。其定义例如以下(openssl/evp.h):
int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *x, int padding);
int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen);
const EVP_CIPHER *EVP_get_cipherbyname(const char *name);
#define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a))
#define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a))
int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);
#define EVP_CIPHER_nid(e) ((e)->nid)
#define EVP_CIPHER_block_size(e) ((e)->block_size)
#define EVP_CIPHER_key_length(e) ((e)->key_len)
#define EVP_CIPHER_iv_length(e) ((e)->iv_len)
#define EVP_CIPHER_flags(e) ((e)->flags)
#define EVP_CIPHER_mode(e) ((e)->flags) & EVP_CIPH_MODE)
int EVP_CIPHER_type(const EVP_CIPHER *ctx);
#define EVP_CIPHER_CTX_cipher(e) ((e)->cipher)
#define EVP_CIPHER_CTX_nid(e) ((e)->cipher->nid)
#define EVP_CIPHER_CTX_block_size(e) ((e)->cipher->block_size)
#define EVP_CIPHER_CTX_key_length(e) ((e)->key_len)
#define EVP_CIPHER_CTX_iv_length(e) ((e)->cipher->iv_len)
#define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data)
#define EVP_CIPHER_CTX_set_app_data(e,d) ((e)->app_data=(char *)(d))
#define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c))
#define EVP_CIPHER_CTX_flags(e) ((e)->cipher->flags)
#define EVP_CIPHER_CTX_mode(e) ((e)->cipher->flags & EVP_CIPH_MODE)
int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
【EVP_CIPHER_CTX_set_padding】
该函数设置是否採用padding功能.在算法缺省的情况下。是使用标准的块padding功能的,而且在解密的时候会自己主动接測padding并将它删除。
假设将參数pad设置为0,则padding功能就会被禁止,那么在加密和解密的时候。数据应该为加密块长度的整数倍,否则就会出错。函数恒返回1。
【EVP_CIPHER_CTX_set_key_length】
该函数进行加密算法结构EVP_CIPHER_CTX密钥长度的设置。
假设算法是一个密钥长度固定的算法,那么假设设置的密钥长度跟它固定的长度不一致,就会产生错误。
【EVP_get_cipherbyname, EVP_get_cipherbynid和EVP_get_cipherbyobj】
这三个函数都依据给定的參数返回一个EVP_CIPHER结构,不同的是给定的參数各自是算法名称、算法的NID和一个ASN1_OBJECT结构。
详细的算法名称、NID以及ASN1_OBJECT结构请參看object/boject.h文件的定义。
【EVP_CIPHER_nid和EVP_CIPHER_CTX_nid】
这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的NID。返回的NID值仅仅是一个内部存储的值。并不一定真的有对应的OBJECT定义。
【EVP_CIPHER_key_length和EVP_CIPHER_CTX_key_length】
这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的密钥长度。
常量EVP_MAX_KEY_LENGTH定义了全部算法最长的密钥长度。
须要注意的是,对于EVP_CIPHER_key_length函数来说,对特定的一种算法密钥长度是不变的。可是EVP_CIPHER_CTX_key_length函数对同一个算法密钥长度却是可变的。
【EVP_CIPHER_iv_length和EVP_CIPHER_CTX_iv_length】
这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的初始化向量长度。假设算法不使用IV,那么就会返回0。
常量EVP_MAX_IV_LENGTH定义了全部算法最长的IV长度
【EVP_CIPHER_block_size和EVP_CIPHER_CTX_block_size】
这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的加密块长度。
常量EVP_MAX_IV_LENGTH也是全部算法最长的块长度。
【EVP_CIPHER_type和EVP_CIPHER_CTX_type】
这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的类型。该类型的值是算法的NID,一般来说,NID忽略了算法的一些參数,如40位和129位RC2算法的NID是同样的。假设算法没有对应定义的NID或者不是ASN1所支持的,那么本函数就会返回NID_undef。
【EVP_CIPHER_CTX_cipher】
该函数返回EVP_CIPHER_CTX结构里面的EVP_CIPHER结构。
【EVP_CIPHER_mode和EVP_CIPHER_CTX_mode】
这两个函数返回对应结构算法的块加密模式,包含EVP_CIPH_ECB_MODE, EVP_CIPH_CBC_MODE, EVP_CIPH_CFB_MODE和EVP_CIPH_OFB_MODE;假设算法是流加密算法,那么就返回EVP_CIPH_STREAM_CIPHER 。
【EVP_CIPHER_param_to_asn1】
该函数设置算法结构的參数。一般来说设置的值包含了全部參数和一个IV值。假设算法有IV,那么调用该函数时IV是必须设置的。该函数必须在所设置的算法结构使用之前(如调用EVP_EncryptUpdate和EVP_DecryptUpdate函数之前)调用。
假设ASN1不支持该算法。那么调用该函数将导致失败。操作成功返回1,否则返回0。
【EVP_CIPHER_asn1_to_param】
该函数给用算法结构里面的值设置參数type的结构。
其设置的内容由详细的算法决定。如在RC2算法中。它会设置IV和有效密钥长度。
本函数应该在算法结构的基本算法类型已经设置了可是密钥还没有设置之前调用。比如,调用EVP_CipherInit函数的时候使用參数IV,并将key设置位NULL,然后就应该调用本函数,最后再调用EVP_CipherInit,这时候除了key设置位NULL外全部參数都应该设置。
当ASN1不支持不支持该算法或者有參数不能设置的时候(如RC2的有效密钥长度不支持),该函数调用就会失败。操作成功返回1,否则返回0。
【EVP_CIPHER_CTX_ctrl】
该函数能够设置不同算法的特定的參数。
眼下仅仅有RC2算法的有效密钥长度和RC5算法的加密次数(rounds)能够进行设置。
BTW:我自己感觉都写的有一点慢了。知道大家想知道怎么用来编程,可是,先把这么多函数介绍清楚了,以下看起来就会轻松多了,下一篇就将介绍EVP_Encrypt*...*系列函数的编程框架,并举几个样例。
openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)的更多相关文章
- openssl之EVP系列之1---算法封装
openssl之EVP系列之1---算法封装 ---依据openssl doc/crypto/EVP.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah ...
- openssl之EVP系列之8---EVP_Digest系列函数具体解释
openssl之EVP系列之8---EVP_Digest系列函数具体解释 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作 ...
- openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例
openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例 ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay. ...
- openssl之EVP系列之2---对称加密算法概述
openssl之EVP系列之2---对称加密算法概述 ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.doc ...
- openssl之EVP系列之13---EVP_Open系列函数介绍
openssl之EVP系列之13---EVP_Open系列函数介绍 ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成 (作者:Dra ...
- openssl之EVP系列之9---EVP_Digest系列函数的一个样例
openssl之EVP系列之9---EVP_Digest系列函数的一个样例 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译 (作者:Drago ...
- openssl之EVP系列之7---信息摘要算法结构概述
openssl之EVP系列之7---信息摘要算法结构概述 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作者:Dragon ...
- openssl之EVP系列之12---EVP_Seal系列函数介绍
openssl之EVP系列之12---EVP_Seal系列函数介绍 ---依据openssl doc/crypto/EVP_SealInit.pod翻译和自己的理解写成 (作者:Dra ...
- openssl之EVP系列之11---EVP_Verify系列函数介绍
openssl之EVP系列之11---EVP_Verify系列函数介绍 ---依据openssl doc/crypto/EVP_VerifyInit.pod翻译和自己的理解写成 (作者 ...
随机推荐
- zzulioj--1807--小明在努力(递归)
1807: 小明在努力 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 95 Solved: 35 SubmitStatusWeb Board Des ...
- [BZOJ3670] [NOI2014] 动物园 解题报告 (KMP)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3670 Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅, ...
- jzoj1495 宝石 解题报告[扫描线]
Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线 ...
- MySql-Error: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
MySql-Error: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 标签( ...
- LOJ #109. 并查集
内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论 1 测试数据 题目描述 这是一道模板题. 维护一个 nnn 点 ...
- LINQ返回DataTable类型 list转dataset 转换为JSON对象
using System.Web.Script.Serialization; using System.Collections.Generic; using System.Reflection; us ...
- RMAN备份脚本--DataGuard primary
单机环境全备 export ORACLE_BASE=/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORACL ...
- 因子问题 I - Ugly Numbers
题目: Ugly numbers are numbers whose only prime factors are 2, 3 or 5 . The sequence 1, 2, 3, 4, 5, 6, ...
- POJ2299 树状数组求逆序对
裸题,不多解释. #include<iostream> #include<cstdio> #include<algorithm> #include<cstri ...
- numpy中list array matrix比较
用python中的numpy包的时候不小心踩了array和matrix的大坑,又引申一下比较list array matrix之间的异同.数据结构(Data Structures)基本上人如其名——它 ...