何日复西归 2024-12-13 10:18 采纳率: 0%
浏览 5

相同的秘钥和hash算法,为什么tpm2和openssl的hmac签名结果不一样

我想在客户端使用tpm2完成消息的hmac签名,在服务器使用openssl对消息做验签。
于是我做了这样的验证:


echo "Hello world!" > message.txt
openssl rand -out hmac_key.bin 32
tpm2_createprimary -C o -g sha256 -G rsa2048 -c primary.ctx
tpm2_evictcontrol -C o -c primary.ctx  0x81000001
tpm2_import -C primary.ctx -u hmac_pub.pem -r hmac_pri.pem -i hmac_key.bin -G hmac
tpm2_load -C primary.ctx -u hmac_pub.pem -r hmac_pri.pem -c hmac.ctx
tpm2_evictcontrol -C o -c hmac.ctx 0x81010002
tpm2_hmac -c hmac.ctx -g sha256 -o message_hmac_tpm.bin message.txt
openssl dgst -sha256 -mac HMAC -macopt key:"$(xxd -p hmac_key.bin)" -out message_hmac_openssl.bin -binary message.txt
cmp message_hmac_tpm.bin message_hmac_openssl.bin

结果是:

message_hmac_tpm.bin message_hmac_openssl.bin differ: byte 1, line 1

两个签名结果文件的大小是一样的:

-rw-r--r-- 1 root root 32 Dec 12 18:11 message_hmac_openssl.bin
-rw-rw---- 1 root root 32 Dec 12 18:11 message_hmac_tpm.bin
  • 写回答

1条回答 默认 最新

  • 越重天 新星创作者: Java技术领域 2024-12-13 11:16
    关注

    本答案参考多次询问ChatGPT-3.5后选择的最佳回答,若是满意,还请采纳,谢谢。

    1. 可能的原因分析
      • 数据格式处理差异
        • 在TPM2和OpenSSL中,虽然使用相同的密钥和哈希算法,但对于数据的预处理可能不同。例如,TPM2可能会对输入的消息进行某种特定的编码转换,而OpenSSL可能采用不同的默认编码方式。比如,在处理文本消息时,TPM2可能将字符串按照特定的字节序进行编码,而OpenSSL可能采用不同的字节序或者字符编码方式。
        • 对于密钥的处理也可能存在类似问题。虽然密钥是相同的,但在导入和使用过程中,TPM2和OpenSSL可能有不同的内部表示形式。例如,TPM2可能会对密钥进行额外的封装或者格式转换,以适应其内部的安全存储和处理机制,而OpenSSL可能直接使用原始的密钥格式。
      • 算法实现细节差异
        • 尽管都声称使用相同的HMAC和SHA - 256算法,但在实际的实现过程中可能存在细微的差别。例如,在计算哈希值时,对于数据块的划分和处理顺序可能不同。SHA - 256算法在处理数据时是按照一定的数据块大小进行迭代计算的,TPM2和OpenSSL可能在数据块的填充方式、迭代计算的起始状态等方面存在差异。
        • 在HMAC计算过程中,涉及到密钥与消息的组合方式。虽然理论上是按照标准的HMAC计算流程(如先对密钥进行填充,然后与消息进行异或操作等),但在具体实现中,TPM2和OpenSSL可能在填充的具体字节值、异或操作的顺序等方面存在不同。
    2. 解决建议
      • 检查数据格式
        • 仔细检查输入消息在TPM2和OpenSSL中的数据格式。确保在两边都使用相同的编码方式,例如,如果在TPM2中消息是以UTF - 8编码的,那么在OpenSSL中也应该使用相同的编码。对于密钥也是如此,可以尝试将密钥以相同的十六进制表示形式或者二进制形式在两边进行使用。
        • 查看TPM2和OpenSSL的文档,了解它们对于输入数据的要求和默认处理方式,尽量使两边的数据处理方式保持一致。
      • 深入算法实现细节
        • 研究TPM2和OpenSSL关于HMAC - SHA256算法的实现文档。如果可能的话,查看源代码(如果开源),比较它们在算法实现中的关键步骤,如数据块处理、哈希迭代计算等方面的差异。
        • 可以尝试使用一些中间工具来验证数据在各个阶段的状态。例如,在计算HMAC之前,先分别在TPM2和OpenSSL中输出消息和密钥的中间表示形式,看是否存在差异。
    评论

报告相同问题?

问题事件

  • 创建了问题 12月13日