Java 使用SHA1从多个值计算聚合

Java 使用SHA1从多个值计算聚合,java,c,sha1,tpm,Java,C,Sha1,Tpm,我正在使用完整性度量体系结构(IMA)(),我正在尝试用Java编写他们在C中已经完成的工作,并在上面的链接页面中进行了解释 从测量值列表开始: PCR-00:07274edf7147abda49200100fd668ce2c3a374d7 PCR-01:48dff4fbf3a34d56a08dfc1504a3a9d707678ff7 PCR-02:53de584dcef03f6a7dac1a240a835893896f218d PCR-03:3a3f780f11a4b49969fcaa80cd

我正在使用完整性度量体系结构(IMA)(),我正在尝试用Java编写他们在C中已经完成的工作,并在上面的链接页面中进行了解释

从测量值列表开始:

PCR-00:07274edf7147abda49200100fd668ce2c3a374d7

PCR-01:48dff4fbf3a34d56a08dfc1504a3a9d707678ff7

PCR-02:53de584dcef03f6a7dac1a240a835893896f218d

PCR-03:3a3f780f11a4b49969fcaa80cd6e3957c33b2275

PCR-04:acb44e9dd4594d3f121df2848f572e4d891f0574

PCR-05:df72e880e68a2b52e6b6738bb4244b932e0f1c76

PCR-06:585e579e48997fee8efd20830c6a841eb353c628

PCR-07:3a3f780f11a4b49969fcaa80cd6e3957c33b2275

我需要计算所有这些测量值的总和。执行此操作的C代码是:

SHA1_Init(&c);
for (i = 0; i < NUM_PCRS; i++) {
    if (DEBUG) {
        printf("PCR-%2.2x: ", i);
        display_sha1_digest(pcr[i].digest);
    }
    SHA1_Update(&c, pcr[i].digest, 20);
}
SHA1_Final(boot_aggregate, &c);

但我得到的是“EA3487AC70DC445A2E608ED44DC550366F2C6716”,而不是预期的结果:“B5A166C10D153B7CC3E5B4F1EAB71672B7C524”。有什么建议吗?

请注意C程序中的大小:

SHA1_Update(&c, pcr[i].digest, 20);
这告诉您,
pcr[i].digest
是一个20字节的数组。它被转换为十六进制格式只是为了显示,但在内部,它只有20个字节

现在,您要做的是将摘要的十六进制表示形式(40个字符长)放入摘要中。这意味着,如果您的PCR摘要是
07274edf7…
,则获取字符
0
的值、字符
7
的值,依此类推,然后对其进行摘要

这是不对的。您应该消化值
0x07
0x27
,等等

因此,如果您只有值的十六进制表示形式,那么应该首先将其解析为字节数组。不使用
String.getBytes(“UTF-8”)
——这只会给出字符串中字符的字节值!您可能可以使用
javax.xml.bind.DatatypeConverter.parseHexBinary


但在实际的程序中,不是将PCR设置为字符串的程序,您应该已经拥有20字节长的数组,这些数组是以前摘要的结果(使用
printHexBinary
之前的值)。这是您应该更新摘要的值。

您正在摘要值的十六进制表示形式。您应该将其转换回实际值(第一个字节为0x07,第二个字节为0x27等的字节数组)。在生成摘要之前,我必须对其进行转换吗?
SHA1_Update(&c, pcr[i].digest, 20);