加密芯片ATSHA204之使用
目录
- 看手册
- Command Packets
- Configuration Zone
- Lock Command
- Nonce Command
- GenDig Command
- Write Command
- Read Command
- MAC Command
- DeriveKey Command
- 相关参考
本文旨在记录 ATSHA204 的使用过程。ATSHA204 是一个安全认证和验证设备,可防止设备被抄袭,应该可以算一个加密芯片。
看手册
了解一个芯片先看手册,先看硬件相关部分,此芯片有多种封装,3管脚芯片为单线通信,8引脚芯片为 I2C 通信,本文主要记录 I2C 通信。
由于设备在使用时需要先行唤醒,需要使用 SDA 管脚发送超过 tWLO = 60us
的时间,也是下面截图提到的 I2C 的频率在低于133kHz时,发送0x00能够达到唤醒的效果。发送完成,需延时至少大于 tWHI = 2.5ms
,让 SDA 管脚为高,其后可进行正常通信。虽然本器件的 I2C 速率可达 1MHz,但为了方便唤醒操作,直接设置速率为 100kMz。
以上简单的描述了发送的数据与回复的数据,例如设备唤醒后,会回复4字节:0x04,0x11,2字节CRC
Command Packets
设备唤醒后就可正常通信,使用 Command 0x03
此处为发送的命令包格式:
Command 的一般命令为 0x03
Count 为 Count 及其之后的所有数据的个数
回复的数据包
Count 为 回复的所有值,包括 Count
Data 为 回复的数据值,有 1字节,4字节,32字节
以上分别列出了 Command 包的 Opcode、Param1、Param2 值列表。
相关的命令操作码如上图 Table 8-6 Command Opcodes ,主要用到了以下几个,下面具体说说。
- DeriveKey Command
- GenDig Command
- Lock Command
- MAC Command
- Nonce Command
- Read Command
- Write Command
Configuration Zone
要想使用芯片,需要先对 Configuration Zone 进行数据进行配置。
主要配置 Slot Configuration:
数据 Slot 总共有16个区域,每个区域可以存储 32 字节。
作为密钥存储,禁止读写,IsSecret(bit7)为1,EncryptRead(bit6)为0,WriteConfig(bit15-12)为never(x01x 或 10xx)
普通数据可以使用加密读写,也可以普通读写,本文主要说明加密读写。加密写 WriteConfig(Bit14)设置为1;加密读 IsSecret(bit7)为1,EncryptRead(bit6)为1
密钥区设置 0x80 0x80
加密读写设置 0xC0 0xF0 (此处的两个字节的低 4 位分别为加密读与写所使用的槽号,此处为 slot0)
Lock Command
写完配置后,需要对 Configuration Zone 中的 Lock Config 加锁
使用 Lock 命令 ,发送 0x03 0x07 0x17 0x80 0x00 0x00 + 2字节CRC
完成配置区域的锁定,就可以写入16个 slot 数据了
这里不加密些的话直接使用 0x12 命令即可,若要使用加密写,则需要先发送 Nonce 与 Gendig, 生成值保存于 TempKey 中
Nonce Command
Nonce 发送 0x03 0x1B 0x16 0x00 0x00 0x00 + 20个随机数 + 2字节CRC
此时芯片会返回 32 字节,按上图就行 SHA-256 计算,得出存储在芯片内部的 TempKey 值。
GenDig Command
下一步则是发送 GenDig ,GenDig 命令使用 SHA-256 将存储的值与 TempKey 的内容组合起来。
GenDig 发送 0x03 0x07 0x15 0x00 0x00 0x00 + 2字节CRC
初次加密写,此处使用 config 中的 slot0,芯片返回 0 则成功,通过上图红框计算出新的值,同时该值也会由芯片计算,存储 TempKey 中。
Write Command
加密发送之前,需要先计算出 Mac 值(这里的 Mac 与 Mac Command 是两码事),
TempKey 为 GenDig 后,通过 SHA-256 计算出的值,32字节
PlainTextData 为要发送的数据,32字节
Opcode :0x12
Param1 : 0xC2
Param2 : 所要写入数据的 Slot 值,如下所示:(32字节写入,为其中的 Block)
上图中要发送的 Value 为 GenDig 后,通过 SHA-256 计算出的值 与 所要发送的值 PlainTextData 异或后计算出的值。
数据写完成后,还可对OTP写入,同上。
完成后,锁定数据区:
使用 Lock 命令 ,发送 0x03 0x07 0x17 0x81 0x00 0x00 + 2字节CRC
这时,完成了 config 与 data 区域的锁定,configuration 设置 0x80 0x80 的就无法读写,设置 0xCx 0xFx 则可根据设置加密读写的 Slot 来进行加密读写。
Read Command
例如:读取未加密 Data slot1 32字节值,直接发送 0x03 0x07 0x02 0x82 0x08 0x00 + 2字节CRC
则返回 0x23 + 32字节 slot1 存储值 + 2字节CRC
读取未加密 Data slot1 最后 4 字节值,直接发送 0x03 0x07 0x02 0x02 0x0F 0x00 + 2字节CRC
加密读时需要先运行GenDig命令,以生成用于解密的密钥。GenDig 使用上面已经提及,先发送 Nonce,然后 GenDig。
例如读取设置 0xCF 0xFF 配置的 Slot1,使用密钥 Slot15 数据,则发送 Nonce 命令,
后发送GenDig 命令 0x03 0x07 0x15 0x02 0x0F 0x00 + 2字节CRC
计算解密密钥时,前32字节为 Slot15 数据,其他没啥变化
而后发送读命令则会返回加密后的 32 字节数据,与上面 GenDig 后计算的解密密钥异或,则可得到 Slot1 中的值。
MAC Command
Mac 命令可返回一个 32字节的 SHA-256 digest,也就是一个在密钥区计算后得出的一个 32字节的 SHA-256 计算值,可与程序内部的已知密钥比较,正确则程序继续运行。可用于相对简单的防抄袭。
例如使用 Slot15 区域的密钥,发送 Mac 命令时也是先发送 Nonce 命令。
Mac 命令发送 0x03 0x07 0x08 0x41 0x0F 0x00 + 2字节CRC,
mode值 0x41,具体如下图,只使用 SN[2:3] 和 SN[4:7]
发送成功,则返回 32字节的 SHA-256 digest,
通过程序内部计算得出一个新的 SHA-256 digest 值,与返回值比较,相同则通过检查,程序可继续运行。相关 是否使用 OTP 与 SN,与发送 Mac 命令时的 Mode 值有关。
DeriveKey Command
该命令主要进行密钥的滚动或者创建新密钥,要使用它,需要在配置 Slot Configuration 时,将其中 Write Config 的 Bit 13 设置为1,同时还分为 Target 和 Parent key,Target key 主要指本身 Slot 值,Parent key 指配置 Slot Configuration 时 WriteKey 设置的 Slot 中的值
使用 DeriveKey 命令时,需要先发送 Nonce(设置mode 为 0x00),
则 DeriveKey 命令中的 TempKey.SourceFlag 为 0(Rand),SlotConfig[TargetKey].Bit15 若是设置,则需要计算 Mac 值,计算数据中的 ParentKey 是 SlotConfig[TargetKey].WriteKey 设置时的 Slot 中的值。
发送 DeriveKey 命令,则所在 Slot 的值发生变化,按上图使用 SHA-256 计算得出值即为所在 Slot 的更新值。
对于 Slot 0~7( Slot 8~14 忽略 SingleUse 位) ,如果 SlotConfig [TargetKey] 的 Bit12 或 SlotConfig [TargetKey] 的 Bit15 被设置为1,且 SlotConfig[ParentKey].SingleUse 也设置为1,在 UseFlag[ParentKey] 为0x00 的情况下,DeriveKey 命令会返回错误。
UseFlag 值 0xFF 为 8 次使用,0x7F为 7次使用,以此类推。
当成功执行时,DeriveKey 总是将 Target key 的 UseFlag 重置为 0xFF,这是重置UseFlag位的唯一机制。
数据 Slot 15 比较特殊,其没有重置机制,在 配置中的 LastKeyUse 都是描述 Slot 15 的有限使用次数,16个 LastKeyUse, 共 128 次使用(可更改使用次数),在128次使用之后,密钥 Slot 15 将永久禁用。
在DeriveKey命令中,SingleUse 位用于 Parent key,但被 Target key 忽略。
相关参考
https://blog.csdn.net/a5882230/article/details/52214845
源码 :https://github.com/nsood/sha204
加密芯片ATSHA204之使用相关推荐
- 加密芯片ATSHA204读序列号(Serial Number)
近段时间一个项目使用了atsha204,硬件电路设计好后,需要设计一个程序来测试芯片是否正常工作,于是写了一个读Serial Number的程序. 本文参考了博文 <atsha204a加密芯片使 ...
- 选一个适合自己的加密芯片,加密IC,如何才能真正的做到不被破解。
做嵌入式产品,最头痛的事情就是害怕自己的代码给别人读出来,不需要通过自己,人家直接拿去生产了.所以要保护自己的最好方式就是使用硬加密IC的方式.当然有句话说的好"这世上没有破解不了的加密算法 ...
- ATSHA204A加密芯片攻略——使用篇
ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的,功能丰富的加密IC,使用SHA-256算法进行加密操作,内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥,唯一的9字节 ...
- 嵌入式常用的加密芯片
加密算法: AES 加密芯片过程: https://zhidao.baidu.com/question/1734554986679308627.html 破解加密芯片博客: http://blog.s ...
- UART接口算法移植加密芯片的调试技巧——通讯调试
算法移植类加密芯片是凌科芯安公司的专利产品,主要功能是芯片内部嵌入凌科芯安公司的LKCOS智能操作系统,用户可以把MCU中程序一部分关键算法函数移植到芯片中运行.用户采用标准C语言编写代码,通过KEI ...
- ilm 和dlm差异_电力通信系统--加密芯片.pdf
电力通信系统--加密芯片 1 芯片结构 FD/TD/VD NVM ILM_RAM DLM_RAM AHB_RAM2 WDT (548KB) (16KB) (24KB) (256B) EMPU TIME ...
- java sha1加密ascii码_如何使用加密芯片完成SHA1摘要运算
1. 测试目标 使用LKT系列加密芯片进行SHA1摘要运算并使用openssl验证正确性 2. 测试环境 本示例LKT加密芯片运行环境为windows系统.测试软件LCS KIT.LKT-K100开发 ...
- 如何使用加密芯片完成SHA1摘要运算
2019独角兽企业重金招聘Python工程师标准>>> 1.测试目标 使用LKT系列加密芯片进行SHA1摘要运算并使用openssl验证正确性 2.测试环境 本示例LKT加密芯片运行 ...
- LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密
1.测试目标 使用已经预置DES密钥的LKT4201N系列加密芯片完成运算 2.测试环境 本示例运行环境为windows系统.测试软件LCS KIT.LKT-K100开发板. 3.测试步骤 注意:&q ...
最新文章
- 【转载】混合高斯模型(Mixtures of Gaussians)和EM算法
- android 外文期刊_AndroSimilar: Robust signature for detecting variants of Android malware
- linux之权限管理_1
- 【小程序踩坑系列5】小程序内多重调用原生promise,无返回,无报错,代码卡住...
- 《MySQL——外部检测与内部统计 判断 主库是否出现问题》
- 软件验收标准和验收方法_卫生间防水验收标准
- Struts 2读书笔记-----使用Struts 2的输入校验
- 格力:核心科技有时也是高利贷
- geotools绘制椭圆API
- HDP SandBox 安装与初步配置
- 3.2 Hadoop生态
- Movavi Video Editor如何添加影片慢动作效果
- WritableWorkbook 详细用例 (转)
- 【图像处理基础】基于matlab图像SRGB+Adobe RGB伽马校正【含Matlab源码 255期】
- CMM3学习笔记二—工程类PA之需求管理(REQM)
- python化学模拟_rdkit 化学反应高级功能
- openstack(云主机热迁移)
- “pip-script.py”is not present的问题
- clickhouse 物化视图使用详解
- 阿里P8大牛手把手教你!15个经典面试问题及回答思路,全套教学资料
热门文章
- java调用shell脚本,解决传参和权限问题
- matlab 梯度 什么意思,浅谈Matlab中的梯度(gradient)
- Node.js 字体格式转换 ttf2eot ttf2woff ttf2svg
- 《极简GDP史》精髓:GDP虽有诸多局限性,但是对于社会经济发展仍然有举足轻重的作用
- 电脑故障一查通 软件教学
- 一天 第一章 花在花苞未有泪,人见不识无言对
- Unity之升高人物视野
- 【Mybatis】Mybatis将String类型的0存到数据库中的number类型字段中,变成了空;
- 硅谷码农35岁危机:Java之父也找不到工作
- MVC 音乐商店 第 7 部分: 会员资格和授权