OpenSSL中验证是先对原始数据计算摘要, 再对摘要进行私钥加密. 验证过程是对原始消息计算摘要,解密验证值, 和摘要对比是否致.如果致, 介绍说明验证有效:否则,则认为原文或验证值已经被篡改.
介绍:
要先对原始数据计算摘要, 所以在计算摘要时用是计算摘要样. 最后在结束中进行验证或验证. 为了方便描述, OpenSSL对计算摘要进行了宏定义封装.下边是定义:
1、 签名化
# EVP_SignInit_ex(a, b, c) EVP_DigestInit_ex(a, b, c)
Int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *imp1);
2、 签名更新
# EVP_SignUpdate(a, b, c) EVP_DigestUpdate(a, b, c)
Int EVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);
3、 签名结束
Int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned *s, EVP_PKey pkey);
功能:计算签名结束 输出签名值
参数介绍说明:
Ctx:[IN]上下文变量
Md:[OUT] 签名结果输出值指针 s:[OUT] 签名长度
Pkey:[IN] 签名私钥(*后面有私钥计算过程)
4、 验证化 (* 跟签名同个)
# EVP_VeryInit_ex(a, b, c) EVP_DigestInit_ex(a, b, c)
Int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *imp1);
5、 验证更新(* 跟签名同个)
# EVP_VeryUpdate(a, b, c) EVP_DigestUpdate(a, b, c)
Int EVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);
6、 验证结束
Int EVP_VeryFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned siglen, EVP_PKey pkey);
功能:计算验证结束 输出验证值
参数介绍说明:
Ctx:[IN]上下文变量
sigbuf:[IN] 签名值 siglen:[IN] 签名长度
Pkey:[IN] 验证签名公钥
计算私钥过程: 直接写代码出来(*下面代码如果按百分算话最多只能得 3十分 所以不要照搬, 我这么写只是想把过程说得简单清楚点)
RSA rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);//产生个1024位RSA密钥
EVP_PKEY *evpKey = EVP_PKEY_; //新建个EVP_PKEY变量
EVP_PKEY_1_RSA(evpKey, rsa); //保存RSA结构体到EVP_PKEY结构体
//完成任务后面就可以用evpKey来签名了
最新评论