---
title: 准备用户固件完整性保护文件
description: "- 公私钥文件是使用用户固件完整性保护的功能时，进行身份验证和数据加密的核心凭证。私钥文件尤其敏感，一旦泄露，可能导致未经授权的访问、数据泄露或其他安全风险。"
url: https://www.hikunpeng.com/document/detail/zh/flexda/devguide/dpak_dev0081.html
sourcePath: /source/zh/flexda/devguide/dpak_dev0081.html
indexId: 8689838a8ce3a2d5bac04ba87096c66861afe6b68ce815ba9db8ec8333dca92a44
---
# 准备用户固件完整性保护文件

#### 注意事项

- 公私钥文件是使用用户固件完整性保护的功能时，进行身份验证和数据加密的核心凭证。私钥文件尤其敏感，一旦泄露，可能导致未经授权的访问、数据泄露或其他安全风险。
- 开发者有责任妥善保管和保护您的公私钥文件。请确保私钥文件存储在安全的环境中，并限制对其的访问权限。任何因公私钥文件泄露、丢失或被滥用而导致的后果，均由开发者自行承担。
- 如果私钥文件被泄露或被盗用，可能导致以下后果：

  - 未经授权的访问本开发套件或相关服务。
  - 数据泄露或被篡改。
  - 其他可能的安全风险或法律后果。
- 为确保公私钥文件的安全，建议您采取以下措施：

  - 将私钥文件存储在安全的位置，避免与他人共享。
  - 定期检查文件权限，确保只有授权人员可以访问。
  - 如果怀疑私钥文件已被泄露，请立即停止使用并更换根证书。
  - 务必使用加密格式存储私钥文件： 强烈建议生成并使用加密格式的私钥文件。未加密的明文私钥文件风险极高，一旦被非法获取，攻击者无需任何额外信息即可直接使用该私钥进行身份验证或解密操作，等同于完全暴露核心凭证。请确保在生成或转换私钥时启用密码加密，并妥善保管该密码。


#### 操作步骤

1. 执行以下命令安装所需的Python库pycryptodome。

```
pip3 install pycryptodome
```


  打印如下示例信息即表示安装成功。

```
Successfully installed pycryptodome-3.21.0
```


2. 如果因为网络问题导致安装失败，可以尝试使用下列方式进行安装。

  - 从    华为云(https://mirrors.huaweicloud.com/artifactory/pypi-public/simple/pycryptodome/)
或    阿里云(https://mirrors.aliyun.com/pypi/simple/pycryptodome/)
中找到对应的pycryptodome版本下载。
  - pip3安装

    a. 根据操作系统的架构选择相应的软件包版本。

      - 对于x86环境，建议安装        pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(https://mirrors.huaweicloud.com/artifactory/pypi-public/packages/ea/66/6f2b7ddb457b19f73b82053ecc83ba768680609d56dd457dbc7e902c41aa/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8)
。
      - 对于ARM环境，建议安装        pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl(https://mirrors.aliyun.com/pypi/packages/6a/c1/f75a1aaff0c20c11df8dc8e2bf8057e7f73296af7dfd8cbb40077d1c930d/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e)
。
    b. 安装软件包。

```
pip3 install {下载路径}/{pycryptodome的whl文件}
```


      不同操作系统的安装步骤一致，以下以ARM环境的软件包为例进行说明。

      将下载到的文件上传至编译环境的自定义目录，执行以下命令安装pip3。

```
pip3 install {自定义目录}/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
```


3. 生成公私钥文件。

  a. 使用OpenSSL生成加密RSA私钥。

```
openssl genrsa -aes256 -out private_key.pem 4096
```


    打印以下内容请输入私钥口令。

```
Enter PEM pass phrase:
```


    打印以下内容请输入私钥口令。

```
Verifying - Enter PEM pass phrase:
```


    结束后当前目录会生成私钥文件rsa_private.key。

  b. 使用OpenSSL生成公钥文件。

```
openssl rsa -in private_key.pem -pubout -out public_key.pem
```


    打印以下内容请输入私钥口令。

```
Enter pass phrase for private_key.pem:
```


    打印以下内容表示公钥生成成功，当前目录下会生成公钥文件public_key.pem。

```
writing RSA key
```


  c. 输入内容到脚本generate_customer_pubkey_ne.py。

```
# ----------------------------------------------------------------------------
# Purpose:
# Copyright Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
# ----------------------------------------------------------------------------
import argparse
import os
from Crypto.PublicKey import RSA
def main():
# 创建命令行参数解析器
parser = argparse.ArgumentParser(
description="Specifies the save directory where the public and private key files and hash files are generated.")
# 添加公钥路径
parser.add_argument(
'-p', '--public_key_path',
type=str,
required=True,
help='The path of the generated public key file.'
)
# 添加命令行参数，用于接收输出目录
parser.add_argument(
'-o', '--output_dir',
type=str,
required=True,
help='The directory where the generated file is saved.'
)
# 解析命令行参数
args = parser.parse_args()
if not os.path.exists(args.public_key_path):
print("The public key file does not exist.")
return
# 获取指定的输出目录
output_dir = args.output_dir
# 检查目录是否存在，如果不存在则创建该目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)  # 如果目录不存在，创建目录
# 生成 4096 位 RSA 密钥对
with open(args.public_key_path, 'rb') as f:
pub_key = RSA.import_key(f.read())
# 获取公钥的 n 和 e
n = pub_key.n
e = pub_key.e
# 将 n 转换为 512 字节的字节格式
n_bytes = n.to_bytes(512, byteorder='big')
# 将 e 转换为 512 字节的字节格式，如果 e 比 512 字节小则填充前导零
e_bytes = e.to_bytes(512, byteorder='big')
# 将 n 和 e 拼接成 n||e 格式
ne_bytes = n_bytes + e_bytes
# 将拼接的 n||e 写入二进制文件
file_path = os.path.join(output_dir, "public_key_ne.bin")
with open(file_path, 'wb') as f:
f.write(ne_bytes)
print(f"n||e format public key has been saved to {file_path}.")
if __name__ == '__main__':
main()
```


  d. 执行以下命令，生成公私钥文件。

```
python3 generate_customer_pubkey_ne.py -p {公钥文件public_key.pem路径} -o
{指定存放目录}
```


打印以下信息表示公私钥文件已生成。

```
n||e format public key has been saved to /public_key_ne.bin.
```

4. 请确认系统已安装OpenSSL工具，执行以下命令对文件签名。

```
openssl dgst -sha256 -sign "$PRIVATE_KEY_PATH" -out "$SIGNATURE_FILE" -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 "$FILE_PATH"
```


  - PRIVATE_KEY_PATH：使用的私钥文件private_key.pem。
  - SIGNATURE_FILE：期待输出的签名文件sig_disable.bin。
  - FILE_PATH：需要签名的文件public_key_ne.bin。
打印以下内容，请输入私钥口令。
```
Enter pass phrase for private_key.pem:
```


在对应文件目录下查看打印内容，打印以下内容表示签名文件成功生成。

```
-rw-r--r-- 1 root root  3242  Apr 27 14:12 private_key.pem
-rw-r--r-- 1 root root  1024  Apr 27 14:12 public_key_ne.bin
-rw-r--r-- 1 root root  512   Apr 27 17:25 sig_disable.bin
```
