1.
链接:https://blog.csdn.net/bruce135lee/article/details/81811403
2.链接:https://www.cnblogs.com/gordon0918/p/5332803.html
3.SM4
代码链接
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
void
tEVP_Encrypt()
{
unsigned
char
key[EVP_MAX_KEY_LENGTH];
//密钥
unsigned
char
iv[EVP_MAX_KEY_LENGTH];
//初始化向量
EVP_CIPHER_CTX* ctx;
//EVP算法上下文
unsigned
char
out
[1024];
//输出密文缓冲区
int
outl;
//密文长度
int
outltmp;
const
char
*msg=
"Hello OpenSSL"
;
//待加密的数据
int
rv;
int
i;
//初始化函数才能用!
ctx = EVP_CIPHER_CTX_new();
//设置key和iv(可以采用随机数和可以是用户输入)
for
(i=0;i<24;i++)
{
key[i]=i;
}
for
(i=0;i<8;i++)
{
iv[i]=i;
}
//初始化密码算法结构体
EVP_CIPHER_CTX_init(ctx);
//设置算法和密钥以
rv = EVP_EncryptInit_ex(ctx,EVP_sm4_cbc(),NULL,key,iv);
if
(rv!=1)
{
printf(
"Err\n"
);
return
;
}
//数据加密
rv = EVP_EncryptUpdate(ctx,
out
,&outl,(
const
unsigned
char
*)msg,strlen(msg));
if
(rv!=1)
{
printf(
"Err\n"
);
return
;
}
//结束数据加密,把剩余数据输出。
rv = EVP_EncryptFinal_ex(ctx,
out
+outl,&outltmp);
if
(rv!=1)
{
printf(
"Err\n"
);
return
;
}
outl = outl +outltmp;
printf(
"原文为:%s\n"
,msg);
//打印输出密文
printf(
"密文长度:%d\n密文数据:\n"
,outl);
for
(i=0;i<outl;i++)
{
printf(
"0x%02x "
,
out
[i]);
}
printf(
"\n"
);
}
int
main()
{
OpenSSL_add_all_algorithms();
tEVP_Encrypt();
return
0;
}
![](https://img2020.cnblogs.com/blog/1812352/202111/1812352-20211111151651977-219789228.png)
SM3
代码:
mysm3.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#include <stdio.h> #include <string.h> #include <openssl/evp.h> void tDigest() { unsigned char sm3_value[EVP_MAX_MD_SIZE]; //保存输出的摘要值的数组 int sm3_len, i; EVP_MD_CTX *sm3ctx; //EVP消息摘要结构体 sm3ctx = EVP_MD_CTX_new(); //调用函数初始化 char msg1[] = "Test Message1" ; //待计算摘要的消息1 char msg2[] = "Test Message2" ; //待计算摘要的消息2 EVP_MD_CTX_init(sm3ctx); //初始化摘要结构体 EVP_DigestInit_ex(sm3ctx, EVP_sm3(), NULL); //设置摘要算法和密码算法引擎,这里密码算法使用sm3,算法引擎使用OpenSSL默认引擎即软算法 EVP_DigestUpdate(sm3ctx, msg1, strlen(msg1)); //调用摘要UpDate计算msg1的摘要 EVP_DigestUpdate(sm3ctx, msg2, strlen(msg2)); //调用摘要UpDate计算msg2的摘要 EVP_DigestFinal_ex(sm3ctx, sm3_value, &sm3_len); //摘要结束,输出摘要值 EVP_MD_CTX_reset(sm3ctx); //释放内存 printf( "原始数据%s和%s的摘要值为:\n" ,msg1,msg2); for (i = 0; i < sm3_len; i++) { printf( "0x%02x " , sm3_value[i]); } printf( "\n" ); } int main() { OpenSSL_add_all_algorithms(); tDigest(); return 0; } |