openssl 学习 evp
时间: 2023-10-24 21:29:39 浏览: 56
OpenSSL中的EVP(Enveloped Data Processing)是一个高级API,提供了一种简单易用的方式来实现各种密码学算法。EVP API支持对称加密、非对称加密、哈希、消息认证码(MAC)和数字签名等功能。
以下是一些使用EVP API的示例:
1. 对称加密
对称加密使用相同的密钥对数据进行加密和解密。以下代码展示了如何使用EVP API进行对称加密:
```c
EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
EVP_EncryptUpdate(ctx, out, &outl, in, inl);
EVP_EncryptFinal_ex(ctx, out + outl, &tmpl);
EVP_CIPHER_CTX_free(ctx);
```
其中,key是加密密钥,iv是初始化向量,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度,tmpl是临时变量。
2. 非对称加密
非对称加密使用公钥加密数据,私钥解密数据。以下代码展示了如何使用EVP API进行非对称加密:
```c
EVP_PKEY *pkey;
pkey = EVP_PKEY_new();
EVP_PKEY_set1_RSA(pkey, rsa);
EVP_PKEY_CTX *ctx;
ctx = EVP_PKEY_CTX_new(pkey, NULL);
EVP_PKEY_encrypt_init(ctx);
EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
EVP_PKEY_encrypt(ctx, out, &outl, in, inl);
EVP_PKEY_CTX_free(ctx);
EVP_PKEY_free(pkey);
```
其中,rsa是RSA密钥对,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。
3. 哈希
哈希函数将任意长度的数据映射为固定长度的摘要值。以下代码展示了如何使用EVP API进行哈希:
```c
EVP_MD_CTX *ctx;
ctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(ctx, EVP_sha256(), NULL);
EVP_DigestUpdate(ctx, in, inl);
EVP_DigestFinal_ex(ctx, out, &outl);
EVP_MD_CTX_free(ctx);
```
其中,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。
4. MAC
MAC是一种用于验证消息完整性和真实性的技术。以下代码展示了如何使用EVP API进行MAC:
```c
EVP_MD_CTX *ctx;
ctx = EVP_MD_CTX_new();
EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, pkey);
EVP_DigestSignUpdate(ctx, in, inl);
EVP_DigestSignFinal(ctx, out, &outl);
EVP_MD_CTX_free(ctx);
```
其中,pkey是私钥,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。
5. 数字签名
数字签名是一种用于验证消息来源和完整性的技术。以下代码展示了如何使用EVP API进行数字签名:
```c
EVP_MD_CTX *ctx;
ctx = EVP_MD_CTX_new();
EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, pkey);
EVP_DigestSignUpdate(ctx, in, inl);
EVP_DigestSignFinal(ctx, NULL, &slen);
EVP_SignFinal(ctx, out, &outl, pkey);
EVP_MD_CTX_free(ctx);
```
其中,pkey是私钥,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度,slen是临时变量。