赞
踩
假设EVP_PKEY *pkey已经生成完毕。
表3.3 加密解密步骤
加密(多步式) | 解密(多步式) | |
1 | pkctx = EVP_PKEY_CTX_new( pkey, NULL)) | pkctx = EVP_PKEY_CTX_new( pkey, NULL)) |
2 | EVP_PKEY_encrypt_init(pkctx) | EVP_PKEY_decrypt_init(pkctx) |
3 | EVP_PKEY_CTX_set_ec_enc_type( pkctx, NID_sm_scheme) | EVP_PKEY_CTX_set_ec_enc_type( pkctx, NID_sm_scheme) |
4 | EVP_PKEY_encrypt( pkctx, ct, &clen, msg, mlen) | EVP_PKEY_decrypt( pkctx, mbuf, &mlen, ct, clen) |
5 | EVP_PKEY_CTX_free(pkctx); | EVP_PKEY_CTX_free(pkctx); |
加密(一步式) | 解密(一步式) | |
1 | EVP_PKEY_encrypt_old( ct, msg, mlen, pkey); | EVP_PKEY_decrypt_old( pt, ct, clen, pkey) |
其中
函 数 名: int EVP_PKEY_encrypt_init (EVP_PKEY_CTX *ctx);
功能描述: 加密之前的EVP_PKEY_CTX初始化
说 明: -
参数说明:
ctx (in/out) EVP_PKEY_CTX
返 回 值: 1[成功],<=0[失败]
函 数 名: #define EVP_PKEY_CTX_set_ec_enc_type(ctx, type)
功能描述: 利用曲线类型设置加密/解密的曲线参数
说 明: -
参数说明:
ctx (in/out) EVP_PKEY_CTX
type (in) 类型
返 回 值: 1[成功],<=0[失败]
函 数 名: int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, const unsigned char *in, size_t inlen);
功能描述: 加密
说 明:
1. 需一次性将数据送完
2. 密文C1||C2||C3,其中C1共65字节,首字节为点的表示形式(如0x4)。
参数说明:
ctx (in/out) EVP_PKEY_CTX
out (out) 密文(字符型)
outlen (out) 密文长度
in (in) 明文
inlen (in) 明文长度
返 回 值: 1[成功],<=0[失败]
函 数 名: int EVP_PKEY_encrypt_old(unsigned char *out, const unsigned char *in, int inlen, EVP_PKEY *pub_key);
功能描述: 加密(一次性完成)
说 明:
a) ctx = EVP_PKEY_CTX_new(pkey, NULL)
b) EVP_PKEY_encrypt_init(ctx)
c) EVP_PKEY_CTX_set_ec_enc_type(ctx, NID_sm_scheme)
d) EVP_PKEY_encrypt(ctx, out, &size, in, inlen)
e) EVP_PKEY_CTX_free(ctx);
参数说明:
out (out) 密文(字符型)
in (in) 明文
inlen (in) 明文长度
pub_key (in) 密钥
返 回 值: >=1[密文长度],<=0[失败]
函 数 名: int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx);
功能描述: 解密之前的EVP_PKEY_CTX初始化
说 明: -
参数说明:
ctx (in/out) EVP_PKEY_CTX
返 回 值: 1[成功],<=0[失败]
函 数 名: int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, const unsigned char *in, size_t inlen);
功能描述: 解密
说 明:
1. 需一次性将数据送完
2. 密文C1||C2||C3,其中C1共65字节,首字节为点的表示形式(如0x4)。
参数说明:
ctx (in/out) EVP_PKEY_CTX
out (out) 明文(字符型)
outlen (out) 明文长度
in (in) 密文
inlen (in) 密文长度
返 回 值: 1[成功],<=0[失败]
函 数 名: int EVP_PKEY_decrypt_old(unsigned char *out, const unsigned char *in, int inlen, EVP_PKEY *pkey)
功能描述: 解密(一次性完成)
说 明:
a) ctx = EVP_PKEY_CTX_new(pkey, NULL)
b) EVP_PKEY_decrypt_init(ctx)
c) EVP_PKEY_CTX_set_ec_enc_type(ctx, NID_sm_scheme)
d) EVP_PKEY_decrypt(ctx, out, &size, in, inlen)
e) EVP_PKEY_CTX_free(ctx);
参数说明:
out (out) 明文(字符型)
in (in) 密文
inlen (in) 密文长度
pub_key (in) 密钥
返 回 值: >=1[明文长度],<=0[失败]
注意:其中密钥EVP_PKEY *pkey的生成代码参见密钥生成代码示例。
#define DEAL_ERR(lab)\
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);\
goto lab;
int test_evp_pkey_encrypt(EVP_PKEY *pkey, int do_sm2 )
{
int ret = 0;
EVP_PKEY_CTX *pkctx = NULL;
int type = do_sm2 ? NID_sm_scheme : NID_secg_scheme;
unsigned char msg[] = "hello world this is the message";
size_t msglen = sizeof(msg);
unsigned char cbuf[512];
size_t cbuflen = sizeof(cbuf);
unsigned char mbuf[512];
size_t mbuflen = sizeof(mbuf);
int len;
unsigned int ulen;
if (!(pkctx = EVP_PKEY_CTX_new(pkey, NULL))) {DEAL_ERR(end);}
if (!EVP_PKEY_encrypt_init(pkctx)) {DEAL_ERR(end);}
if (!EVP_PKEY_CTX_set_ec_enc_type(pkctx, type)) {DEAL_ERR(end);}
cbuflen = sizeof(cbuf);
if (!EVP_PKEY_encrypt(pkctx, cbuf, &cbuflen, msg, msglen)) {DEAL_ERR(end);}
if (!EVP_PKEY_decrypt_init(pkctx)) {DEAL_ERR(end);}
if (!EVP_PKEY_CTX_set_ec_enc_type(pkctx, type)) {DEAL_ERR(end);}
memset(mbuf, 0, sizeof(mbuf));
mbuflen = sizeof(mbuf);
if (!EVP_PKEY_decrypt(pkctx, mbuf, &mbuflen, cbuf, cbuflen)) {DEAL_ERR(end);}
ret = 1;
end:
EVP_PKEY_CTX_free(pkctx);
return ret;
}
#define DEAL_ERR(lab)\
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);\
goto lab;
int test_evp_pkey_encdec_old(EVP_PKEY *pkey )
{
int ret = 0;
unsigned char msg[] = "hello world this is the message";
size_t msglen = sizeof(msg);
unsigned char cbuf[512];
size_t cbuflen = sizeof(cbuf);
unsigned char mbuf[512];
size_t mbuflen = sizeof(mbuf);
int len;
if ((len = EVP_PKEY_encrypt_old(cbuf, msg,(int)msglen, pkey)) <= 0) {DEAL_ERR(end);}
memset(mbuf, 0, sizeof(mbuf));
if ((len = EVP_PKEY_decrypt_old(mbuf, cbuf, len, pkey)) <= 0) {DEAL_ERR(end);}
printf("%s() passed!\n", __FUNCTION__);
ret = 1;
end:
return ret;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。