物联网加密技术之单向散列函数

单向散列函数


前言

我本人是一名物联网代码搬运工,一些项目开发中总会涉及到通信过程的加密,数据的加密,以保证产品的安全可靠。
在最开始的时候只知道加密连接是SSL,其中的原理方法一窍不通,网上的资料越看越觉得水深。
后来在某当找到了这本《密码技术与物联网安全》,基于mbedtls的开发,正合我意。收货之后一直是零零散散的看着,也没有系统学习,因为种种原因又重新拿起它准备做一次系统的学习,并把学习内容记录下来。
这篇博客以及后续的此系列的都是读书笔记,欢迎指正探讨。


前面的概述以及基础的数理知识就不写了,主要原因是那些数理实在看的我头痛,我也暂时没想要搞算法,就先带过它,保留在日后进阶使用。

单向散列函数

单向散列函数又称安全散列函数或哈希函数,它是根据消息的内容计算出散列值,可用于检验消息的完整性。散列值又称信息摘要或摘要,它是一个长度固定且不随消息长度改变而改变的数值。最常见的单向散列函数就是MD5。

原理

1.场景举例

假设有如下场景:Alice需要传送一个文件给Bob,Bob需要知道文件在传输过程是否发生了篡改或者传输错误
应用单向散列函数,具体过程如下:

(1)Alice准备好待传输的文件
(2)Alice使用单向散列函数计算出文件的消息摘要
(3)Alice将文件和消息摘要一起发送给Bob
(4)Bob接收到文件后使用相同的单向散列函数计算出文件的消息摘要
(5)Bob对比接收到的下消息摘要是否与计算得到的消息摘要一致

2.函数性质

单向散列函数需满足以下性质,其中单向散列函数描述为h(x):

性质描述
输入长度可变h(x)的输入为任意长度的消息
输出长度固定h(x)的输出长度固定
高效率计算h(x)较为容易
单向性给定一个输出z,通过计算找到满足h(x)=z的输入是不可行的
抗弱碰撞性给定x1,找到满足h(x1)=h(x2)的x2在计算上是不可行的
抗强碰撞性找到满足h(x1)=h(x2)的一对x1、x2(x1≠x2)在计算上是不可行的
伪随机性h(x)需满足伪随机性测试标准

3.函数应用

  1. 消息完整性检测
  2. 伪随机数生成器
  3. 消息认证码
  4. 数字签名
  5. 一次性口令

实现方法

常见的单向散列函数实习的方法主要有两大算法:

1.MD算法家族

  • MD4:由Rivest设计,是较早提出的版本,MD5和SHA算法都是基于MD4的基本原理设计实现的,它能够生成128bit的散列值,其散列碰撞性已被攻破。
  • MD5:由Rivest设计,它能够生成128bit的散列值,其抗碰撞性已被攻破。

2.SHA算法家族

SHA算法全称为安全散列算法(secure hash algorithms),由美国国家标准与技术研究所(NIST)制定,该系列算法是美国联邦信息处理标准的一部分。

  • SHA0:1993年发布,可产生160bit的消息摘要,由于未公开的重大缺陷,发布不久之后就被撤销。
  • SHA1:能够产生160bit的消息摘要,由于存在缺陷,2010年之后大多数应用都不推荐使用。
  • SHA2:由美国国家安全局设计,包括SHA256、SHA384、SHA512,其消息摘要长度分别是256bit、384bit、512bit。
  • SHA3:支持与SHA相同的消息摘要长度,但内部结构与SHA系列的其他算法并不相同。

SHA256

单向散列函数的典型实现是SH256算法,大部分单向散列函数的构造方法都与其类似,书中详细描述了SHA256的实现过程,我目前还没达到这个水平,只做简单的了解。

单项散列函数的计算过程分为两个阶段,分别是预处理和哈希计算。(以下为SHA256计算过程)

1.预处理

1.消息填充

预处理阶段需要对消息进行填充,使消息达到512bit的整数倍。

2.消息分割

完成消息的填充后,将其分解为N个512bit的分组。

3.设置初始摘要值

在消息摘要计算之前,必须要设置初始的散列值,初始值的大小和数量取决于消息摘要的长度。对于SHA256算法,初始的散列值包含8个32bit的数值

4.准备常量

需要准备一系列的常量字,SHA256需要64个32bit的数值

2.哈希计算

预处理完成后开始正式的哈希计算,主要分四个步骤,有兴趣的可以去书中研究,我已经两眼全是圈圈了。

1. 消息调度
2. 初始化工作寄存器
3. 更新工作寄存器
4. 计算消息摘要

mbedtls示例

书中示例将消息"abc"作为测试样本,使用SHA256计算出消息摘要,这里只把main函数部分代码贴出来,平台移植部分就不写了。

int main(void)
{
	uint8_t digest[32];
	char *msg = "abc";
	
	mbedtls_md_context_t ctx;
	const mbedtls_md_info_t *info;
	mbedtls_platform_set_printf(printf);
	
	mbedtls_md_init(&ctx);
	info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
	
	mbedtls_md_setup(&ctx, info ,0);
	mbedtls_printf("\n md info setup, name: %s, digest size:%d\n",
					mbedtls_md_get_name(info),mbedtls_md_get_size(info));

	mbedtls_md_start(&ctx);
	mbedtls_md_update(&ctx, msg, strlen(msg));
	mbedtls_md_finish(&ctx, digest);

	mbedtls_md_free(&ctx);
	
	return 0;
}

1.接口描述

接口描述
mbedtls_md_init初始化md结构体
mbedtls_md_info_from_type根据算法类型得到md信息结构体指针
mbedtls_md_setup设置md结构体,完成md结构体内部接口初始化
mbedtls_md_get_name获取单向散列算法名称
mbedtls_md_get_size获取单向散列算法输出消息摘要的长度
mbedtls_md_startsmd启动接口,只需调用一次
mbedtls_md_updatemd更新接口,处理输入数据,包括消息预处理和计算,可多次调用
mbedtls_md_finishmd完成接口,输出消息摘要
mbedtls_md_free释放md结构体
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值