2017-05-21 8 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); 

이 코드를 사용하여 결과는 다음과 같습니다 b5a166c10d153b7cc3e5b4f1eab1f71672b7c524

내가 그렇게이 자바 라인을 writed :

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 ". 어떠한 제안?

+1

값의 16 진수 표현을 요약합니다. 다시 실제 값으로 변환해야합니다 (첫 번째 바이트가 0x07이고 두 번째 바이트가 0x27 등인 바이트 배열) – RealSkeptic

+0

다이제스트를 만들기 전에 변환해야합니까? –

답변

0

참고하여 C 프로그램의 크기 :

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

이것은 pcr[i].digest 20 바이트의 배열이 있음을 알려줍니다. 그것은 디스플레이를 위해서만 16 진수 형식으로 변환되지만 내부적으로는 20 바이트입니다.

이제 40 자 길이의 다이제스트의 16 진수 표현을 가져와 다이제스트에 넣었습니다. 즉, PCR 다이제스트가 07274edf7... 인 경우 0 문자의 값, 7 문자의 값 등을 취하면 해당 값을 소화합니다.

정확하지 않습니다. 0x07, 0x27 등의 값을 소화해야합니다.

16 진수 표현을 모두 가지고 있다면 먼저 바이트 배열로 구문 분석해야합니다. String.getBytes("UTF-8")을 사용하지 않고 문자열에있는 문자의 바이트 값을 제공합니다. 아마도 javax.xml.bind.DatatypeConverter.parseHexBinary을 사용할 수 있습니다.

그러나 PCR로 문자열을 설정하지 않은 실제 프로그램에서는 이전 다이제스트 (printHexBinary을 사용하기 전의 값)의 결과 인 20 바이트 길이의 배열이 이미 있어야합니다. 이것이 다이제스트를 업데이트해야하는 가치입니다.

+0

도움 주셔서 감사합니다! –