1.环境
平台:Windows10
开发工具:CLion
OpenSSL:OpenSSL 1.1.1m(32位)
工具链:MingGW530_32
Win32OpenSSL-1_1_1m.msi-网络安全文档类资源-CSDN文库
2.SM3摘要Demo
2.1 使用CLion,新建一个C项目。
- 选择新建项目的类型,可以是C执行程序,也可以是C++执行程序。我们选择C执行程序;
- 选择项目存放的路径。我们命名项目名称为05_OpenSSL;
- 选择语言标准,使用默认的C99标准;
- 点击右下角Create俺就,创建项目。
项目中有两个重要文件:main.c 和 CMakeLists.txt 。
main.c :源文件
CMakeLists.txt:CMake的配置文件,用于对软件编译过程进行控制。
?2.1运行程序
点击CLion右侧的三角Run按钮,在CLion下方输出程序运行结果。打印出Hello,World!
3. 默认的CMakeList.txt
新建项目中的CMakeLists.txt如下图:
# 指定CMake最低版本要求
cmake_minimum_required(VERSION 3.17)
#设置项目名称
project(05_OpenSSL C)
#环境变量 CMAKE_C_STANDARD 为99 ,使用C99标准
set(CMAKE_C_STANDARD 99)
#生成的执行文件05_OpenSSL ,main.c为生成可执行文件需要的源代码
add_executable(05_OpenSSL main.c)
4. Demo程序:使用OpenSSL的SM3计算摘要
4.1 修改CMakeLists.txt
增加OpenSSL头文件和库,链接库:
cmake_minimum_required(VERSION 3.17)
project(05_OpenSSL C)
set(CMAKE_C_STANDARD 99)
#定义两个变量,表示头文件路径和库路径
set(INC_DIR D:\\ProgramFiles\\OpenSSL-Win32\\include)
set(LINK_DIR D:\\ProgramFiles\\OpenSSL-Win32\\lib)
#依次设置头文件目录、库目录、要链接的库 (在add_executable 之前)
include_directories(${INC_DIR})
link_directories(${LINK_DIR})
link_libraries(openssl libcrypto)
add_executable(05_OpenSSL main.c)
#链接库 在add_executable之后 03_OpenSSL为工程名 ssl为库名称
target_link_libraries(05_OpenSSL openssl)
其中Windows中OpenSSL安装的路径为:D:\\ProgramFiles\\OpenSSL-Win32\\?
4.2 编码main.c
使用SM3计算摘要:
main.c
#include <stdio.h>
#include <string.h>
#include "openssl/evp.h"
int main() {
printf("Hello, OpenSSL!\n");
/* 加载所有算法 */
OpenSSL_add_all_algorithms();
/* SM3摘要算法 */
unsigned char md_value[EVP_MAX_MD_SIZE]; //保存输出的摘要值的数组
unsigned int md_len;
EVP_MD_CTX *pmdctx = EVP_MD_CTX_new(); //EVP消息结构体
char msg1[] = "Test Message1"; //待计算摘要的消息1
char msg2[] = "Test Message2"; //待计算只要的消息2
int i=0;
EVP_MD_CTX_init(pmdctx); //初始化摘要结构体
//设置摘要算法和密码算法引擎,这里密码算法使用SM3
//算法引擎使用OpenSSL默认引擎,即软算法
EVP_DigestInit_ex(pmdctx,EVP_sm3(),NULL);
EVP_DigestUpdate(pmdctx,msg1,strlen(msg1)); //调用摘要Update计算msg1的摘要
EVP_DigestUpdate(pmdctx,msg2,strlen(msg2)); //调用摘要Update计算msg2的摘要
EVP_DigestFinal_ex(pmdctx,md_value,&md_len); //摘要结束,输出摘要值
/* 打印结果 */
printf("原始数据%s和%s的摘要为:\n",msg1,msg2);
for(i=0;i<md_len;i++)
{
printf("%02X ",md_value[i]);
}
printf("\n");
return 0;
}
4.3 运行,输出如下结果:
|