【安全算法之sha384】sha384摘要运算的c语言源码实现 概述 头文件定义 c语言版本的实现源码 测试用例 github仓库 更多参考链接
概述 大家都知道摘要算法在安全领域,也是一个特别重要的存在,而sha384是其中比较常见的一种摘要算法,它的特点就是计算复杂度较低,不等长的数据原文输入,可以得出等长的摘要值,这个值是固定为48字节。正是由于这种特殊性,很多重要的数据完整性校验领域,都可以看到shaxxx的影子。从复杂度上看,它是复杂于sha256的,但是又比sha512低一些,所以它的位置相对较尴尬,真正使用的场景比较少。
今天给大家带来sha384的c源码版本实现,值得注意的是,sha384与sha512是公用一套核心源码实现,只不过在上下文中有一个is_384的变量,标识是执行sha384运算还是sha512运算,这一点所以需要结合sha512那篇文章一起看。欢迎大家深入学习和讨论。
头文件定义 头文件定义如下,主要定义了sha384的上下文结构体,,以及导出的三个api,其实它是复用了sha512的上下文定义,具体请看sha512:
#ifndef __sha384_h__#define __sha384_h__#include #include sha512.htypedef sha512_ctx_t sha384_ctx_t;#define sha384_digest_len 48 // sha384 outputs a 48 byte digestvoid crypto_sha384_init(sha384_ctx_t *ctx);void crypto_sha384_update(sha384_ctx_t *ctx, const uint8_t *data, uint32_t len);void crypto_sha384_final(sha384_ctx_t *ctx, uint8_t *digest);#endif // __sha384_h__ c语言版本的实现源码 下面是sha384的c语言版本实现,实则是根据sha512的上下文定义及其核心实现代码封装而来的,主要也是围绕导出的3个api:
#include #include sha384.hextern void crypto_sha384_sha512_init(sha512_ctx_t *ctx, int is_384);/* * sha-384 process init */void crypto_sha384_init( sha512_ctx_t *ctx ){ crypto_sha384_sha512_init(ctx, 1);}/* * sha-384 process buffer */void crypto_sha384_update( sha512_ctx_t *ctx, const uint8_t *data, uint32_t len ){ crypto_sha512_update(ctx, data, len);}/* * sha-384 final digest */void crypto_sha384_final( sha512_ctx_t *ctx, uint8_t *digest ){ crypto_sha512_final(ctx, digest);} 测试用例 针对sha384导出的三个接口,我编写了以下测试用例:
#include #include #include sha384.h#include convert.hint log_hexdump(const char *title, const unsigned char *data, int len){ char str[160], octet[10]; int ofs, i, k, d; const unsigned char *buf = (const unsigned char *)data; const char dimm[] = +------------------------------------------------------------------------------+; printf(%s (%d bytes):\r\n, title, len); printf(%s\r\n, dimm); printf(| offset : 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 0123456789abcdef |\r\n); printf(%s\r\n, dimm); for (ofs = 0; ofs < (int)len; ofs += 16) { d = snprintf( str, sizeof(str), | %08x: , ofs ); for (i = 0; i < 16; i++) { if ((i + ofs) < (int)len) { snprintf( octet, sizeof(octet), %02x , buf[ofs + i] ); } else { snprintf( octet, sizeof(octet), ); } d += snprintf( &str[d], sizeof(str) - d, %s, octet ); } d += snprintf( &str[d], sizeof(str) - d, ); k = d; for (i = 0; i < 16; i++) { if ((i + ofs) < (int)len) { str[k++] = (0x20 <= (buf[ofs + i]) && (buf[ofs + i]) 1) { p_calc = argv[1]; } utils_hex_string_2_bytes(data, data_bytes, &len_bytes); log_hexdump(data_bytes, data_bytes, len_bytes); utils_bytes_2_hex_string(data_bytes, len_bytes, data_str); printf(data_str: %s\n, data_str); if (!strcmp(data, data_str)) { printf(hex string - bytes convert ok\n); } else { printf(hex string - bytes convert fail\n); } crypto_sha384_init(&ctx); crypto_sha384_update(&ctx, (uint8_t *)p_calc, strlen(p_calc)); crypto_sha384_final(&ctx, digest_calc); utils_hex_string_2_bytes(digest_exp_str, digest_exp_hex, &len_bytes); if (len_bytes == sizeof(digest_calc) && !memcmp(digest_calc, digest_exp_hex, sizeof(digest_calc))) { printf(sha384 digest test ok\n); log_hexdump(digest_calc, digest_calc, sizeof(digest_calc)); } else { log_hexdump(digest_calc, digest_calc, sizeof(digest_calc)); log_hexdump(digest_exp, digest_exp_hex, sizeof(digest_exp_hex)); printf(sha384 digest test fail\n); } return 0;} 测试用例比较简单,就是对字符串c1d0f8fb4958670dba40ab1f3752ef0d进行sha1运算,期望的摘要结果的hexstring是6737ff230509ccf14036a06ced588722999f1e979b42ede982d5c769f34dafeb4357d71d7774275f5d20419fb2267b99,这个期望值是用算法工具算出来的。
先用api接口算出摘要值,再与期望值比较,这里有个hexstringtobyte的转换,如果比较一致则表示api计算ok;反之,接口计算失败。
同时,也欢迎大家设计提供更多的测试案例代码。
github仓库 以上代码和测试用例,及编译运行等,可以参考我的github仓库,有详细的流程介绍,欢迎大家交流讨论。如果有帮助到你的话,记得帮忙点亮一颗星哦。
更多参考链接 [1] 【安全算法的github仓库】
[2] 【安全算法之概述】一文带你简要了解常见常用的安全算法
知豆发展一波三折,吉利能再次顺利入主知豆汽车吗?
电流互感器的作用及接线方法
邬贺铨:物联网新机遇来了但市场须走出碎片化
日报: 华为昇腾AI全栈软件平台首次全披露 谷歌AI新技术
校园智能视频分析的需求和应用分析
【安全算法之SHA384】SHA384摘要运算C语言源码实现
至美工艺!小米6全陶瓷,骁龙835+HiFi+6GB配置爆炸
自动驾驶合法上路 北京向百度颁发首批T3级别路测号牌
双路AMDRome工程试样平台跑分曝光
dfrobot Series 2 (ZigBee Mesh)传输模块介绍
圣诞节网购钓鱼诈骗花招多,教你一眼看穿真假https
为什么要桥接无线路由器?如何通过网线将两个路由器进行桥接?
对NFC应用在手机的研究
下半年上市的iPhone8、华为Mate10、三星Note8和小米Note3,哪一款才是你最爱?
DC/DC转换器评估篇 损耗探讨-小结
搭建物联网(IoT)智能监控解决方案
Low-Noise Amplifier (LNA) Matc
Linux驱动到底能不能在应用层开发驱动
做一名有脑子的程序员
Python轴承故障诊断之经验模态分解EMD原理介绍