目录

  • 看手册
  • 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之使用相关推荐

  1. 加密芯片ATSHA204读序列号(Serial Number)

    近段时间一个项目使用了atsha204,硬件电路设计好后,需要设计一个程序来测试芯片是否正常工作,于是写了一个读Serial Number的程序. 本文参考了博文 <atsha204a加密芯片使 ...

  2. 选一个适合自己的加密芯片,加密IC,如何才能真正的做到不被破解。

    做嵌入式产品,最头痛的事情就是害怕自己的代码给别人读出来,不需要通过自己,人家直接拿去生产了.所以要保护自己的最好方式就是使用硬加密IC的方式.当然有句话说的好"这世上没有破解不了的加密算法 ...

  3. ATSHA204A加密芯片攻略——使用篇

    ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的,功能丰富的加密IC,使用SHA-256算法进行加密操作,内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥,唯一的9字节 ...

  4. 嵌入式常用的加密芯片

    加密算法: AES 加密芯片过程: https://zhidao.baidu.com/question/1734554986679308627.html 破解加密芯片博客: http://blog.s ...

  5. UART接口算法移植加密芯片的调试技巧——通讯调试

    算法移植类加密芯片是凌科芯安公司的专利产品,主要功能是芯片内部嵌入凌科芯安公司的LKCOS智能操作系统,用户可以把MCU中程序一部分关键算法函数移植到芯片中运行.用户采用标准C语言编写代码,通过KEI ...

  6. ilm 和dlm差异_电力通信系统--加密芯片.pdf

    电力通信系统--加密芯片 1 芯片结构 FD/TD/VD NVM ILM_RAM DLM_RAM AHB_RAM2 WDT (548KB) (16KB) (24KB) (256B) EMPU TIME ...

  7. java sha1加密ascii码_如何使用加密芯片完成SHA1摘要运算

    1. 测试目标 使用LKT系列加密芯片进行SHA1摘要运算并使用openssl验证正确性 2. 测试环境 本示例LKT加密芯片运行环境为windows系统.测试软件LCS KIT.LKT-K100开发 ...

  8. 如何使用加密芯片完成SHA1摘要运算

    2019独角兽企业重金招聘Python工程师标准>>> 1.测试目标 使用LKT系列加密芯片进行SHA1摘要运算并使用openssl验证正确性 2.测试环境 本示例LKT加密芯片运行 ...

  9. LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密

    1.测试目标 使用已经预置DES密钥的LKT4201N系列加密芯片完成运算 2.测试环境 本示例运行环境为windows系统.测试软件LCS KIT.LKT-K100开发板. 3.测试步骤 注意:&q ...

最新文章

  1. 【转载】混合高斯模型(Mixtures of Gaussians)和EM算法
  2. android 外文期刊_AndroSimilar: Robust signature for detecting variants of Android malware
  3. linux之权限管理_1
  4. 【小程序踩坑系列5】小程序内多重调用原生promise,无返回,无报错,代码卡住...
  5. 《MySQL——外部检测与内部统计 判断 主库是否出现问题》
  6. 软件验收标准和验收方法_卫生间防水验收标准
  7. Struts 2读书笔记-----使用Struts 2的输入校验
  8. 格力:核心科技有时也是高利贷
  9. geotools绘制椭圆API
  10. HDP SandBox 安装与初步配置
  11. 3.2 Hadoop生态
  12. Movavi Video Editor如何添加影片慢动作效果
  13. WritableWorkbook 详细用例 (转)
  14. 【图像处理基础】基于matlab图像SRGB+Adobe RGB伽马校正【含Matlab源码 255期】
  15. CMM3学习笔记二—工程类PA之需求管理(REQM)
  16. python化学模拟_rdkit 化学反应高级功能
  17. openstack(云主机热迁移)
  18. “pip-script.py”is not present的问题
  19. clickhouse 物化视图使用详解
  20. 阿里P8大牛手把手教你!15个经典面试问题及回答思路,全套教学资料

热门文章

  1. java调用shell脚本,解决传参和权限问题
  2. matlab 梯度 什么意思,浅谈Matlab中的梯度(gradient)
  3. Node.js 字体格式转换 ttf2eot ttf2woff ttf2svg
  4. 《极简GDP史》精髓:GDP虽有诸多局限性,但是对于社会经济发展仍然有举足轻重的作用
  5. 电脑故障一查通 软件教学
  6. 一天 第一章 花在花苞未有泪,人见不识无言对
  7. Unity之升高人物视野
  8. 【Mybatis】Mybatis将String类型的0存到数据库中的number类型字段中,变成了空;
  9. 硅谷码农35岁危机:Java之父也找不到工作
  10. MVC 音乐商店 第 7 部分: 会员资格和授权