博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openssl evp 哈希算法(md5,sha1,sha256)
阅读量:6177 次
发布时间:2019-06-21

本文共 2708 字,大约阅读时间需要 9 分钟。

1. 简述

openssl提供了丰富密码学工具,一些常用的哈希算法

比如md5,sha 可以直接用提供的md5.h ,sha.h 接口使用;

为了方便开发者使用,openssl 又提供了一个EVP, evp.h 该文件中提供各种常用工具;

man evp 可以得知,evp 是openssl 提供的更高一级的密码学工具,

可以理解为对提供的各种接口的一个封装

EVP文件包含的比较多,本次主要说明EVP提供的哈希算法

2. 示例 sha512代码

   使用需要导入evp.h

//初始化    EVP_MD_CTX *evpCtx = EVP_MD_CTX_new();    EVP_DigestInit_ex(evpCtx, EVP_sha512(), NULL);    char *data = (char *)"hello";    unsigned int len = strlen(data);   //hash计算    EVP_DigestUpdate(evpCtx, data , len);    unsigned char result[SHA512_DIGEST_LENGTH] = {
0};   //返回结果 EVP_DigestFinal_ex(evpCtx, result, &len); hex_print("sha512", result, SHA512_DIGEST_LENGTH);   //直接使用一个函数 unsigned char resultT[SHA512_DIGEST_LENGTH] = {
0}; EVP_Digest("hello", 5, resultT, NULL, EVP_sha512(), NULL); hex_print("sha512", resultT, SHA512_DIGEST_LENGTH);

  上述测试EVP提供的两种方式来进行sha512

 3. 根据evp.h提供的内部可知:

   上述使用的是EVP_512();那么其他的还有:

const EVP_MD *EVP_md2(void);const EVP_MD *EVP_md4(void);const EVP_MD *EVP_md5(void);const EVP_MD *EVP_md5_sha1(void);const EVP_MD *EVP_blake2b512(void);const EVP_MD *EVP_blake2s256(void);const EVP_MD *EVP_sha1(void);const EVP_MD *EVP_sha224(void);const EVP_MD *EVP_sha256(void);const EVP_MD *EVP_sha384(void);const EVP_MD *EVP_sha512(void);

 定义的hash算法的计算长度  

# define SHA224_DIGEST_LENGTH    28# define SHA256_DIGEST_LENGTH    32# define SHA384_DIGEST_LENGTH    48# define SHA512_DIGEST_LENGTH    64

4. 如果不用EVP提供的,还可以直接使用openssl提供的其他接口

   md5.h, sha.h

   如sha.h 中关于 sha512提供的接口

int SHA384_Init(SHA512_CTX *c);int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);int SHA384_Final(unsigned char *md, SHA512_CTX *c);unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md);int SHA512_Init(SHA512_CTX *c);int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);int SHA512_Final(unsigned char *md, SHA512_CTX *c);unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md);

 调用的时候同样有两种方式;如下示例

//初始化    SHA512_CTX ctx;    SHA512_Init(&ctx);    char *data = (char *)"hello";    unsigned int len = strlen(data);    unsigned char result[SHA512_DIGEST_LENGTH] = {
0}; //计算哈希 SHA512_Update(&ctx, data, len); //取结果 SHA512_Final(result, &ctx); hex_print("sha512", result, SHA512_DIGEST_LENGTH); //一个函数调用 unsigned char resultT[SHA512_DIGEST_LENGTH] = {
0}; SHA512("hello", 5, resultT); hex_print("sha512", resultT, SHA512_DIGEST_LENGTH);

5. 最后附上,上述例子中的hex_print代码

static void hex_print(const char *name, const unsigned char *buf, size_t len){    size_t i;    fprintf(stderr, "%s ", name);    for (i = 0; i < len; i++)        fprintf(stderr, "%02X", buf[i]);    fputs("\n", stderr);}

 

参考:

测试使用 openssl 1.1.0c 

  

 

  

转载于:https://www.cnblogs.com/cocoajin/p/6119832.html

你可能感兴趣的文章
【学术信息】中科院2019年学术期刊分区-综合性期刊
查看>>
Linux 安装中文包
查看>>
谷物大脑
查看>>
访问控制-禁止php解析、user_agent,PHP相关配置
查看>>
AgileEAS.NET之系统架构
查看>>
Exchange server 2013 SP1 客户端会议室邮箱自动回复延迟
查看>>
nginx反向代理缓存服务器构建
查看>>
RHEL6 搭建LVS/DR 负载均衡集群 案例
查看>>
以太坊·Rinkeby 测试网络
查看>>
字符串按规则排序算法
查看>>
MPLS + BGP高级特性
查看>>
plist文件读写操作
查看>>
oracle resetlogs和noresetlogs 创建控制文件区别
查看>>
2013-7-17学习作业练习
查看>>
ZAM 3D入门教程(4):Extrusion编辑器
查看>>
《深入实践Spring Boot》一第2章 在Spring Boot中使用数据库2.1 使用MySQL
查看>>
C++语言基础 例程 字符串类
查看>>
堆排序
查看>>
Java的热部署(后期完善)
查看>>
css总结
查看>>