一、工程创建
- 下载 TinyCrypt 开源库,连接
https://gitee.com/heartman_yc/tinycrypt/tree/master
tests/test_hmac.c
是 HMAC 的测试文件,可通过此文件了解消息认证码的使用方法。
- 工程目录结构
头文件和源文件的文件如下:
二、测试结果
测试结果
=================================================
TinyCrypt 轻量级加密库演示程序
=================================================
TinyCrypt是Intel开发的轻量级开源加密库
专为资源受限设备(嵌入式系统、IoT设备)设计
=================================================
=== AES-128 ECB模式演示 ===
密钥: 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
明文: 32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34
密文: 39 25 84 1d 02 dc 09 fb dc 11 85 97 19 6a 0b 32
解密: 32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34
✓ AES-128 ECB模式加解密成功!
=== AES-128 CBC模式演示 ===
length=48
sizeof(ciphertext)=64
TC_AES_BLOCK_SIZE=16
length - TC_AES_BLOCK_SIZE=32
密钥: 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
初始化向量: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
明文: 68 65 6c 6c 6f 20 72 74 2d 74 68 72 65 61 64 21
20 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 20 68 65
6c 6c 6f 20 77 6f 72 6c 64 21 00 00 00 00 00 00
密文: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
dd 38 18 73 f8 44 8a e3 e3 6b 47 49 69 03 fa 9e
97 f5 ad d4 20 59 05 ab e2 f3 75 3a 12 66 67 19
解密: 68 65 6c 6c 6f 20 72 74 2d 74 68 72 65 61 64 21
20 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 20 68 65
6c 6c 6f 20 77 6f 72 6c 64 21 00 00 00 00 00 00
✓ AES-128 CBC模式加解密成功!
=== AES-128 CTR模式演示 ===
密钥: 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
计数器: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff
明文: Hello TinyCrypt! This is CTR mode demonstration.
密文: a4 e9 b3 1f f7 40 28 d9 9c ab 55 07 93 ee d5 c5
16 7f 14 55 14 53 38 10 38 e3 23 85 dc 3d 1c ca
0f 0c a7 1d 15 e6 59 3c ca c6 a9 6f 7e d5 02 6a
解密: Hello TinyCrypt! This is CTR mode demonstration.
✓ AES-128 CTR模式加解密成功!
=== SHA-256哈希算法演示 ===
消息 1: "abc"
SHA-256: ba 78 16 bf 8f 01 cf ea 41 41 40 de 5d ae 22 23
b0 03 61 a3 96 17 7a 9c b4 10 ff 61 f2 00 15 ad
消息 2: "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
SHA-256: 24 8d 6a 61 d2 06 38 b8 e5 c0 26 93 0c 3e 60 39
a3 3c e4 59 64 ff 21 67 f6 ec ed d4 19 db 06 c1
消息 3: "Hello TinyCrypt! This is SHA-256 demonstration."
SHA-256: 2b 3b a2 46 8d ba 2b 36 4d cf 36 66 be 53 bc ad
68 b9 e0 71 12 c1 5c aa a1 d1 0c e4 cc e9 f5 e7
消息 4: "(空字符串)"
SHA-256: e3 b0 c4 42 98 fc 1c 14 9a fb f4 c8 99 6f b9 24
27 ae 41 e4 64 9b 93 4c a4 95 99 1b 78 52 b8 55
✓ SHA-256哈希计算完成!
=== HMAC消息认证码演示 ===
消息 1: "Hello TinyCrypt!"
HMAC: d5 23 ad b0 1f 26 1d f7 9a c2 37 4e 62 3e 47 c8
20 c4 39 b0 40 a7 92 94 1c 69 f3 7c a6 d8 83 f9
消息 2: "This is HMAC demonstration with TinyCrypt library."
HMAC: 10 99 57 df b2 e6 f7 66 35 9e 65 fc 44 96 8c 98
f0 bc 7b c0 5e 07 b9 ae 91 e2 bb c0 37 54 5e a3
消息 3: "IoT device secure communication test message."
HMAC: 11 d5 ed 0c 0d 4d ac 6e 35 08 07 26 04 f9 2d 09
01 15 d2 a7 b2 5d 8b 80 47 cc 5b 0c f0 68 89 d2
✓ HMAC消息认证码计算完成!
=== IoT设备安全通信演示 ===
步骤1:加密传感器数据
原始数据: Temperature:25.6C,Humidity:60%,Pressure:1013hPa
加密数据: eb 4d a3 5a 17 4b fe f8 30 cf 74 68 27 95 67 fb
0d 9a 23 73 51 fd 67 cc cf 0f 4d 6f 0a 44 07 b5
d4 12 35 32 74 6d 26 ea 64 35 4e 54 c8 55 be 9c
步骤2:计算数据完整性校验
HMAC校验: 24 7d 6f 6a 51 cd 28 51 0f 2b 1c 3a d5 85 a7 5e
f9 0b 0b a3 9b 8b 36 3d 7a 3d ce 79 9f d2 53 86
步骤3:接收端验证和解密
✓ HMAC验证成功,数据完整性确认
解密: 54 65 6d 70 65 72 61 74 75 72 65 3a 32 35 2e 36
43 2c 48 75 6d 69 64 69 74 79 3a 36 30 25 2c 50
72 65 73 73 75 72 65 3a 31 30 31 33 68 50 61 01
解密数据: Temperature:25.6C,Humidity:60%,Pressure:1013hPa
解密数据: Temperature:25.6C,Humidity:60%,Pressure:1013hPa
✓ IoT设备安全通信演示成功!
=== TinyCrypt性能测试 ===
AES-128加密 1000次: 0.001秒 (1615508.9次/秒)
SHA-256哈希 1000次: 0.001秒 (1615508.9次/秒)
内存使用情况:
AES密钥调度结构: 176字节
SHA-256状态结构: 112字节
HMAC状态结构: 240字节
=================================================
TinyCrypt演示完成!
=================================================
主要特性:
• 轻量化设计,内存占用极低
• 支持AES-128对称加密(ECB/CBC/CTR模式)
• 提供SHA-256哈希算法
• 支持HMAC消息认证码
• 适用于IoT设备安全通信
• 纯C语言实现,易于集成
博客来源: https://embedded-rd.blog.csdn.net/article/details/148928612
三、Makefile 文件
编写 Makefile 文件,内容如下:
# TinyCrypt演示程序Makefile
# 编译TinyCrypt库和演示程序
CC = gcc
CFLAGS = -Wall -Wextra -std=c99 -O2 -g
INCLUDES = -I./lib/include
SRCDIR = lib/source
# TinyCrypt库源文件
TINYCRYPT_SOURCES = \
$(SRCDIR)/aes_encrypt.c \
$(SRCDIR)/aes_decrypt.c \
$(SRCDIR)/cbc_mode.c \
$(SRCDIR)/ctr_mode.c \
$(SRCDIR)/sha256.c \
$(SRCDIR)/hmac.c \
$(SRCDIR)/utils.c
# 目标文件
TINYCRYPT_OBJECTS = $(TINYCRYPT_SOURCES:.c=.o)
# 主要目标
all: tinycrypt_demo
# 编译演示程序
tinycrypt_demo: tinycrypt_demo.o $(TINYCRYPT_OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ -lm
# 编译规则
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
# 清理
clean:
rm -f tinycrypt_demo
rm -f tinycrypt_demo.o $(TINYCRYPT_OBJECTS)
rm -f $(TESTDIR)/*.o
# 运行演示
run: tinycrypt_demo
./tinycrypt_demo
# 帮助信息
help:
@echo "TinyCrypt演示程序编译选项:"
@echo " make all - 编译所有程序"
@echo " make tinycrypt_demo - 编译演示程序"
@echo " make run - 运行演示程序"
@echo " make test - 运行所有测试"
@echo " make clean - 清理编译文件"
@echo " make help - 显示此帮助信息"
.PHONY: all clean run test help
Makefile 文件注释
# TinyCrypt演示程序Makefile
# 编译TinyCrypt库和演示程序
# 编译器设置
CC = gcc # 使用GCC作为C编译器
CFLAGS = -Wall -Wextra -std=c99 -O2 -g # 编译选项:开启所有警告、使用C99标准、优化级别2并包含调试信息
INCLUDES = -I./lib/include # 头文件搜索路径
# 目录定义
SRCDIR = lib/source # 源代码目录
TESTDIR = tests # 测试代码目录
# TinyCrypt库源文件列表
# 列出需要编译的TinyCrypt库的所有源文件
TINYCRYPT_SOURCES = \
$(SRCDIR)/aes_encrypt.c \ # AES加密算法实现
$(SRCDIR)/aes_decrypt.c \ # AES解密算法实现
$(SRCDIR)/cbc_mode.c \ # CBC模式实现
$(SRCDIR)/ctr_mode.c \ # CTR模式实现
$(SRCDIR)/sha256.c \ # SHA-256哈希算法实现
$(SRCDIR)/hmac.c \ # HMAC实现
$(SRCDIR)/utils.c # 工具函数
# 自动生成目标文件列表
# 将每个源文件的.c扩展名替换为.o
TINYCRYPT_OBJECTS = $(TINYCRYPT_SOURCES:.c=.o)
# 主要目标
# 当执行'make'或'make all'时,会构建这两个目标
all: tinycrypt_demo test_suite
# 编译演示程序
# 链接演示程序的目标文件和TinyCrypt库的目标文件,生成可执行文件
tinycrypt_demo: tinycrypt_demo.o $(TINYCRYPT_OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ -lm # 链接时需要数学库(-lm)
# 编译规则
# 通用规则:如何将任意.c文件编译为.o文件
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ # 只编译不链接
# 清理编译生成的文件
clean:
rm -f tinycrypt_demo # 删除演示程序
rm -f tinycrypt_demo.o $(TINYCRYPT_OBJECTS) # 删除所有目标文件
rm -f $(TESTDIR)/*.o # 删除测试目录下的目标文件
# 运行演示程序
run: tinycrypt_demo
./tinycrypt_demo # 执行演示程序
# 帮助信息
# 显示所有可用的make目标及其功能
help:
@echo "TinyCrypt演示程序编译选项:"
@echo " make all - 编译所有程序"
@echo " make tinycrypt_demo - 编译演示程序"
@echo " make test_suite - 编译测试套件"
@echo " make run - 运行演示程序"
@echo " make test - 运行所有测试"
@echo " make clean - 清理编译文件"
@echo " make help - 显示此帮助信息"
# 声明伪目标
# 这些目标不对应实际的文件,而是执行特定的操作
.PHONY: all clean run test help test_suite
编译,make
执行
make run
四、测试代码
tinycrypt_demo.c
测试代码链接如下:
代码链接
https://mp.weixin.qq.com/s/cbLjTgzDznbVPvrgvqIReg