【问题标题】:Using SHA1 to calculate an aggregate from multiple values使用 SHA1 从多个值计算聚合
【发布时间】:2017-05-21 11:41:44
【问题描述】:

我正在使用完整性测量架构 (IMA) (https://sourceforge.net/p/linux-ima/wiki/Home/),我正在尝试用 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);

使用此代码的结果是:b5a166c10d153b7cc3e5b4f1eab1f71672b7c524

我为此编写了以下 java 行:

    String pcr0 = "07274edf7147abda49200100fd668ce2c3a374d7";
    String pcr1 = "48dff4fbf3a34d56a08dfc1504a3a9d707678ff7";
    String pcr2 = "53de584dcef03f6a7dac1a240a835893896f218d";
    String pcr3 = "3a3f780f11a4b49969fcaa80cd6e3957c33b2275";
    String pcr4 = "acb44e9dd4594d3f121df2848f572e4d891f0574";
    String pcr5 = "df72e880e68a2b52e6b6738bb4244b932e0f1c76";
    String pcr6 = "585e579e48997fee8efd20830c6a841eb353c628";
    String pcr7 = "3a3f780f11a4b49969fcaa80cd6e3957c33b2275";
    MessageDigest hash = MessageDigest.getInstance("SHA-1");
    byte[] firstToLastDigest;
    hash.reset();
    hash.update(pcr0.getBytes("UTF-8"));;
    hash.update(pcr1.getBytes("UTF-8"));
    hash.update(pcr2.getBytes("UTF-8"));
    hash.update(pcr3.getBytes("UTF-8"));
    hash.update(pcr4.getBytes("UTF-8"));
    hash.update(pcr5.getBytes("UTF-8"));
    hash.update(pcr6.getBytes("UTF-8"));
    hash.update(pcr7.getBytes("UTF-8"));
    firstToLastDigest = hash.digest();
    digestStr = javax.xml.bind.DatatypeConverter.printHexBinary(firstToLastDigest);
    System.out.println(digestStr);

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

【问题讨论】:

  • 您正在消化值的十六进制表示。您应该将其转换回实际值(一个字节数组,其第一个字节是 0x07,第二个是 0x27 等)
  • 在制作摘要之前我必须转换它?

标签: java c sha1 tpm


【解决方案1】:

注意 C 程序中的大小:

SHA1_Update(&c, pcr[i].digest, 20);

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

现在您所做的是将摘要的十六进制表示形式(长度为 40 个字符)放入摘要中。这意味着,如果您的 PCR 摘要是07274edf7...,则获取字符0 的值、字符7 的值等等,然后进行消化。

这是不正确的。您应该正在消化 0x070x27 等值。

因此,如果您只有值的十六进制表示,则应首先将其解析为字节数组。不使用String.getBytes("UTF-8") - 这只是为您提供字符串中字符的字节值!您可能可以使用javax.xml.bind.DatatypeConverter.parseHexBinary

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

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多