基于DS28S60的双向身份验证示例,使用Jupyter笔记本

描述

本应用笔记详细介绍了DS28S60与Jupyter笔记本配合使用进行双向认证的基本应用。它使用分步方法来演练设置设备和所有相关软件,创建用于通过 ECDHE 密钥交换加密数据的共享密钥,使用 AES-GCM 加密和解密数据,以及通过 ECDSA 签名生成和验证完成相互身份验证。

介绍

本应用笔记介绍了DS28S60加密处理器的工作原理,概述了使用DS<>S<>器件建立基于主机和客户端的系统,用于密钥生成和交换、加密和双向认证。此用法在随附的 Jupyter 笔记本中有详细说明。首先,让我们讨论通过非对称密钥交换生成主机和客户端使用的共享密钥或共享对称密钥。接下来,让我们概述如何使用共享对称密钥来加密设备和主机之间的通信。最后,让我们演练使用数字证书和签名的相互身份验证过程。

系统加密概述

在系统成员之间交换任何数据之前,DS28S60首先通过创建加密通道来保护各方之间的通信。此示例中的各方包括设备、主机和第三方颁发机构:

  • 设备 :也称为客户端。这是包含DS28S60的实体,它必须与主机通信。例如,这可能是一个传感器节点。
  • 主机 :通常是服务器或计算机。这是必须与设备通信的实体。
  • 颁发机构:称为第三方/证书 颁发机构 。这是受信任方,它向主机和设备提供证书以相互验证。

图 1 显示了主机和设备之间建立和使用加密通道的交互。

传感器

图1.加密通信通道的系统概述。

系统身份验证概述

简而言之,系统身份验证是验证主机和设备的公钥和私钥以验证各方身份的过程。请注意,在启动与密钥对或任何其他敏感信息相关的任何数据交换之前,所有各方之间的通信都是加密的。图 2 显示了身份验证过程中主机、设备和颁发机构之间的交互。

传感器

图2.使用权威实体帮助的双向身份验证的系统概述

硬件、软件和出厂设置

硬件设置

要运行DS28S60的Jupyter笔记本,需要DS28S60以外的两个硬件,它们是DS28S60评估板的一部分。

  • DS9121EQ+ 评估 TDFN 插座板,用作 DS28S60 处理器的集线器并容纳 DS<>S<>。
  • DS9482P# USB 转 I2C/SPI/1 线适配器,用于连接 DS9121EQ+ 插座板和主机。

使用评估板中的USB Micro B电缆将上位计算机与DS9482P#适配器连接。

软件设置

配置硬件后,下一步是获取并初始化软件以运行 Jupyter 笔记本。这些步骤如下:

  1. 下载最新版本的 Python 及其相关库以运行 Jupyter Notebook:
    1. 访问下载 Python | Python.org 并下载最新版本的 Python( 安装时选中“将 Python 添加到路径”选项 )。

    2. 安装 Python 后,如果使用 Windows,请打开命令提示符或任何类似的终端。若要安装库,请输入运行笔记本需要以下库。

      pip install *TARGET LIBRARY*
      
      1. 幼儿发展局
      2. 皮串行
      3. 密码学
      4. Pycryptodome
      5. AES
      6. SPI
  2. 安装并运行 Jupyter Notebook,然后导航到 DS28S60 Notebook 文件夹并运行 DS28S60 Jupyter Notebook 文件 'DS28S60_KeyExchange.ipynb'。有关下载 Jupyter 笔记本的说明,请访问 Jupyter 项目 |安装Jupyter

注意:通过在 Jupyter 笔记本中的“硬件连接设置”部分下运行前两个代码块,检查软件包是否已正确安装,以及硬件是否已连接并成功工作。

出厂设置:ECDSA 密钥生成和证书分发

要生成共享密钥或共享对称密钥,请首先为主机和设备生成公钥和私钥。

以下步骤概述了密钥对的安装和存储以及证书的分发。注意:从应用笔记的这一点开始,每个编号的步骤在Jupyter笔记本中都有一个或多个关联的代码段,必须按顺序运行这些代码段才能完成双向身份验证。

  1. 生成主机的椭圆曲线数字签名算法 (ECDSA) 密钥对和识别信息。
    1. 在 Jupyter 笔记本中,预先选择私钥和公钥数组以保持一致性。不要修改这些值。注意:对于实际应用程序,这些数组永远不会对任何人可见。
    2. 识别信息:同时预先选择Host_ID和Host_Location_Code。不要修改这些值。
  2. 启动托管证书生成的授权。
    1. 将生成证书所需的所有必需信息发送给颁发机构。这需要将公钥、Host_ID和Host_Location_Code打包到要发送的证书消息中。颁发机构使用此信息生成证书,并使用颁发机构私钥对其进行签名。
  3. 生成设备的 ECDSA 密钥对。
    1. 使用 GenEcc256KeyPair 函数为设备生成公钥。请注意,此公钥是可见的,但私钥永远不会被泄露,因为它会危及实际应用程序中的安全性。
  4. 启动设备证书生成权限。
    1. 通过使用 ReadMemory 命令读取设备的 rom 选项页 (116) 来收集设备的标识数据。本页包含识别特定DS28S60器件所需的ROM_ID和MAN_ID。
    2. 将设备的公钥、ROM_ID和MAN_ID连接成证书消息以发送给颁发机构。颁发机构生成使用颁发机构私钥签名的证书。
  5. 将设备证书、颁发机构私钥和功能数据存储在设备中。
    1. 将设备的证书写入其内存。对于此应用程序,选择第 0 页和第 1 页作为内存位置。
    2. 将颁发机构的公钥写入设备的内存。此应用程序选择第 100 页和第 101 页。
    3. 将特征数据写入设备的内存。为此选择第 4 页。注:有关哪个存储器页存储哪些信息的更多信息,请参考DS28S60用户指南。
  6. 为存储的信息设置适当的内存保护。
    1. 为防止篡改新存储的信息,请在包含设备证书和特征数据的页面上设置写保护。注意:对于 Jupyter 笔记本,请省略此步骤。

使用 ECDHE 和 AES-GCM 创建加密通道

要建立加密通道,主机和设备必须首先计算共享密钥。为此,主机和设备会生成 ECDSA 密钥对,但这些密钥是临时的。临时密钥是临时密钥。主机和设备启动椭圆曲线 Diffie-Hellman (ECDH) 密钥交换,以交换这些临时密钥并安全地生成共享密钥。然后,此密钥用于通过 AES-GCM 加密和解密数据。图 3 描述了这种密钥交换交互。

注: 为每个新的通信会话生成新的临时密钥对。

传感器

图3.主机和设备交换临时密钥以计算共享密钥。

以下步骤描述了如何执行 ECDH 密钥交换:

  1. 定义Calculate_ECDH_Shared_Point和increment_aes_iv支持功能。
  2. 生成主机的临时密钥对。
    1. 使用 ecdsa 生成密钥对。SigningKey.generate 和 .get_verifying_key 命令。
    2. 将密钥对转换为数组/列表。
  3. 使用 GenEcc256KeyPair 命令生成设备的临时密钥对。
  4. 计算主机端的 AES 密钥(共享密钥)和初始 AES IV。
    1. 使用 Calculate_ECDH_Shared_Point 函数,将设备的公钥和主机的私钥作为参数。
    2. 使用 SHA-256 哈希算法对计算的共享点进行哈希处理,以生成 AES 共享密钥和 AES IV。
  5. 使用密钥交换命令计算设备端的 AES 密钥和初始 AES IV,将主机的临时公钥作为参数。

此时,双方生成相同的 AES 密钥。因此,双方现在都可以使用高级加密标准伽罗瓦/计数器模式(AES-GCM)对他们之间发送的数据进行加密和解密。图 4 显示了 AES-GCM 提供的加密通信通道。

传感器

图4.主机和设备使用 AES-GCM 算法交换加密数据。请注意,IV 必须在每次传输时递增,并且必须在两端同步。

使用 ECDSA 的双向身份验证

相互身份验证可以分为两部分:使用证书验证公钥,以及使用数字签名和通过ECDSA验证算法验证私钥。ECDSA 算法涉及通过使用私钥生成数字签名来证明真实性的通信方。然后,对方方使用签名、发送签名的一方的公钥和其他数据验证这些数字签名。加密安全的随机数也用于该算法的签名和验证部分,以提高安全性。

使用证书颁发机构验证公钥

ECDSA 算法还用于使用各方的证书、权威机构的公钥和各方的识别数据来验证公钥。此标识数据是主机的主机 ID 数据,以及设备的 ROM ID 和 MAN ID。图 5 描述了在验证各方公钥方面交换此信息的过程。

传感器

图5.主机和设备使用彼此的证书和 ECDSA 验证算法验证彼此的公钥。

以下步骤演练如何对设备(步骤 1 到 4)和主机(步骤 5 到 7)的公钥进行身份验证:

  1. 从设备收集证书和证书消息数据以发送到主机。
    1. 在设备端,使用 ReadMemory 命令回读设备公钥的 X 和 Y 组件。对 ROM 和 MAN ID 重复此操作。
    2. 使用“读取内存”命令读回设备证书的“r”和“s”组件。
  2. 加密请求的数据并将其传输到主机。
    1. 连接证书消息数据(公钥、ROM ID 和 MAN ID),然后连接证书(部分“r”和“s”)。
    2. 使用证书消息数据和证书作为 AesBulkEncrypt 命令的参数。
  3. 解密、提取和验证主机端的数据。确保 AES IV 计数器递增。
  4. 在主机端验证提取的证书消息数据和证书以验证公钥。
  5. 从主机收集证书和证书消息数据,对其进行加密,然后将其发送到设备。
    1. 打包主机公钥、Host_ID和Host_Location_Code的 X 和 Y 组件。
    2. 使用 encrypt_and_digest 命令加密证书和证书消息数据。不要忘记增加AES IV计数器。
  6. 使用 AesBulkDecrypt 命令解密设备端的数据。
  7. 在设备端验证主机提取的证书消息数据和证书,以验证公钥。
    1. 使用“写内存”命令存储主机公钥的 X 和 Y 组件。
    2. 使用身份验证 ECDSACertificate 命令验证主机的证书。

使用数字签名验证私钥

验证设备的公钥后,也要验证设备的私钥。为此,请首先使用设备的私钥生成数字签名。数字签名包含设备特征数据、私钥签名以及主机发送的称为质询的随机字节串。图 6 说明了 ECDSA 签名生成算法中使用的信息交换。

传感器

图6.主机和设备交换挑战,以生成从各自的私钥派生的自己独特的数字签名。

以下步骤介绍如何使用 ECDSA 签名生成和 ECDSA 签名验证算法来完成设备(步骤 1 到 5)和主机(步骤 6 到 9)的身份验证:

  1. 生成要发送到设备的质询。

  2. 使用质询和其他要素数据创建数字签名和签名消息。

    1. 使用 ComputeAndReadPageAuthentication 命令创建签名。
    2. 连接 ROM ID、特征数据、主机质询、数据页、MAN ID 和命令代码字节以创建签名消息。
  3. 使用 AesBulkEncrypt 加密签名和数据,然后将其发送到主机。

  4. 解密并验证主机端的数据,提取签名和签名消息数据,并递增 AES IV 计数器。

  5. 重建签名消息,并使用设备公钥验证解密的签名和签名消息数据。图 7 描述了 ECDSA 签名验证算法,并显示了验证所需的信息片段。

    1. 按以下顺序构建和连接验证所需的数据:ROM ID、功能数据、主机质询、功能数据页面、MAN ID、命令代码。

    传感器
    图7.主机和设备使用 ECDSA 签名验证算法和所有相关数据验证彼此的私钥。

  6. 生成质询以使用 ReadRng 命令发送到主机。

  7. 使用质询和主机数据(Host_ID、Host_Location_Code和主机特征数据)创建数字签名和签名消息。

  8. 对特征数据、签名和签名消息进行加密,并将其发送到设备。不要忘记更新 AES IV 计数器。

  9. 使用 AesBulkDecrypt 命令在设备端解密接收到的数据。

  10. 使用验证 EcdsaSignature 命令验证签名和相关数据。

  11. 按以下顺序构造和连接验证所需的数据:主机 ID、设备质询、主机功能数据、主机位置代码

总结

双向身份验证可以通过关联的 Jupyter 笔记本进行划分和演示。本教程介绍了出厂设置/密钥生成、ECDH 密钥交换、使用 AES-GCM 加密和解密数据,以及通过安全通道进行通信以相互验证主机和设备。除了配置和运行 Jupyter 笔记本所需的步骤外,此处还介绍了这些步骤。以下两篇文档提供了由DS28S60加密处理器提供的完全认证系统。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分