2017-05-21 18 views
0

私はIntegrity Measurement Architecture(IMA)(https://sourceforge.net/p/linux-ima/wiki/Home/)を使って作業しています。すでにCで行ったことをJavaで記述しようとしています。SHA1を使用して複数の値から集計を計算する

PCR-00:07274edf7147abda49200100fd668ce2c3a374d7

PCR-01:48dff4fbf3a34d56a08dfc1504a3a9d707678ff7

PCR-02:53de584dcef03f6a7dac1a240a835893896f218d

PCR-03:3a3f780f11a4b49969fcaa80cd6e3957c33b2275

測定のリストから出発

PCR-04:acb44e9dd4594d3f121df2848f 572e4d891f0574

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); 

このコードを使用して、結果は次のとおりです。

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

私はそれを行うには、このJavaのラインをwrited "期待された結果の代わりに:" b5a166c10d153b7cc3e5b4f1eab1f71672b7c524 "。なにか提案を?

+1

値の16進表現を消化しています。実際の値に戻す必要があります(最初のバイトが0x07、2番目が0x27などのバイト配列) – RealSkeptic

+0

ダイジェストを作成する前に変換する必要がありますか? –

答えて

0

注Cプログラムでのサイズ:

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

これはpcr[i].digestは20バイトの配列であることを示しています。それは表示のためだけに16進形式に変換されますが、内部的には20バイトです。

これで、ダイジェストの長さを40文字にした16進表現をダイジェストに入れました。つまり、PCRダイジェストが07274edf7...の場合は、0という文字の値、7という文字の値などを取り、それを消化します。

これは間違っています。 0x070x27などの部分を消化する必要があります。

16進表現の場合は、まずバイト配列に解析する必要があります。 String.getBytes("UTF-8")を使用していない - これは単に文字列中の文字のバイト値を与えるだけです!おそらくjavax.xml.bind.DatatypeConverter.parseHexBinaryを使用できます。

実際のプログラムでは、PCRを文字列として設定するのではなく、以前のダイジェスト(printHexBinaryを使用する前の値)の結果である20バイトの配列がすでに存在するはずです。これはダイジェストを更新する予定の値です。

+0

助けてくれてありがとう! –

関連する問題