2017-10-04 1 views
0

Golang의 crypto/sha256 패키지에 문제가 있습니다. 나는 동일한 입력을 sha256.Sum256에 두 번씩 보내고 출력은 매번 다릅니다. 다음은 Golang crypto/sha256 - 동일한 입력이 서로 다른 출력을 생성합니다.

//Run the HMAC-SHA256 on the given kmac and message and return the generated MAC tag 
func PCSSHA256(kmac []byte, message []byte) [32]byte { 
    //NOTE: bitwise XOR^only works on integers. 
    kmac64 := append(kmac, []byte(strings.Repeat("0", 48))[0:]...) //Pad to obtain a 64 byte unit 
    tohashinner := make([]byte, 64) 
    for i := 0; i < 64; i++ { 
      tohashinner[i] = kmac64[i]^0x36 
    } 
    tohashouter := make([]byte, 64) 
    for i := 0; i < 64; i++ { 
      tohashouter[i] = kmac64[i]^0x5c 
    } 
    tohashinnerwmess := append(tohashinner, message[0:]...) 
    firsthashval := sha256.Sum256(tohashinnerwmess) 

    fmt.Printf("tohashinner in || bounds:\n||%s||\n", tohashinner) 
    fmt.Printf("tohashouter in || bounds:\n||%s||\n", tohashouter) 
    fmt.Printf("tohashinnerwmess in || bounds:\n||%s||\n", tohashinnerwmess) 
    fmt.Printf("firsthashval after Hex Encode in || bounds:\n||%s||\n", hex.EncodeToString(firsthashval[:])) 

    tag := sha256.Sum256(append(tohashouter, firsthashval[0:]...)) 

    fmt.Printf("Input message in || bounds:\n||%s||\n", message) 
    fmt.Printf("Input kmac in || bounds:\n||%s||\n", kmac) 
    fmt.Printf("Tag generated by PCSSHA256 after Hex Encode in || bounds:\n||%s||\n", hex.EncodeToString(tag[:])) 
    return tag 
} 

가 첫 번째 실행에 대한 fmt.Printf 출력입니다 : 여기

tohashinner in || bounds: 
||gdebc`anolwtursp|| 
tohashouter in || bounds: 
|| 

llllllllllllllllllllllllllllllllllllllllllllllll|| 
tohashinnerwmess in || bounds: 
||gdebc`anolwturspThis is a sample message. It is to be used for testing. 
|| 
firsthashval after Hex Encode in || bounds: 
||7b7bec6f1a9e8860a40730f76f3c5a5f3576a90008630e0dc3fbdc088430ce0f|| 
Input message in || bounds: 
||This is a sample message. It is to be used for testing. 
|| 
Input kmac in || bounds: 
||QRSTUVWXYZABCDEF|| 
Tag generated by PCSSHA256 after Hex Encode in || bounds: 
||fd54280dbbca722e41024100c8fa171fa640c814cb4c06380efced71d37504d5|| 

되고 두 번째 실행의 출력 :

tohashinner in || bounds: 
||gdebc`anolwtursp|| 
tohashouter in || bounds: 
|| 

llllllllllllllllllllllllllllllllllllllllllllllll|| 
tohashinnerwmess in || bounds: 
||gdebc`anolwturspThis is a sample message. It is to be used for testing. 
|| 
firsthashval after Hex Encode in || bounds: 
||632b978ee2b3498754b761e3e091832a6e8f8308ea89f55749a0754f481564d1|| 
Input message in || bounds: 
||This is a sample message. It is to be used for testing. 
|| 
Input kmac in || bounds: 
||QRSTUVWXYZABCDEF|| 
Tag generated by PCSSHA256 after Hex Encode in || bounds: 
||e81de52ce8c7d86ef9937011e2978b452d300b85051cf68f7bd99572558e3cee|| 

내 코드는 다음과 같다

두 출력 모두 firsthashvalue와 결과 태그를 제외하고는 모두 동일합니다. tohashinnerwmess (내가 잘못되고있는 것을 파악하기 위해 사용하는 변수)는 두 경우 모두 동등하며 sha256.Sum256에 입력되는 유일한 것인데 왜 firsthashvalue가 두 입력에 대해 다른지 혼란 스럽습니다.

저는 sha256.Sum256이 결정적이며 주어진 입력에 대해 동일한 출력을 반환 할 것이라고 확신합니다. Go Playground에서이를 테스트했으며 실제로 동일한 결과를 반환했습니다. 그래서 문제가 있다고 가정합니다. 내 코드 또는 Sum256의 내부 작동에 대한 내 이해. 누구든지 내가 뭘 잘못하고 있는지 설명 할 수 있다면 크게 감사하겠습니다.

감사합니다.

EDITS : - 첫 번째 실행에서 PCSSHA256 기능에 대한 메시지 입력은 ioutil.ReadFile()을 사용하여 파일에서 직접 읽습니다. 두 번째 실행에서는 암호화 된 메시지가 AES를 통해 블록 단위로 처리되고 그 후 PCSSHA256으로 전달되었다.

+0

코드에 몇 가지 수정을 가하고 동일한 입력으로 두 번 실행하기 위해'main()'을 추가했습니다 ... 실제로 전달중인 내용을 반영하도록'main() '을 수정할 수 있습니까? https://play.golang.org/p/ujHtWeZNWE –

+1

이 기능으로 보내는 버그에 의심되는 부분이 있습니다. 내 추측은 파일 또는 마샬링 또는 무언가를 읽는 데있어서 일종의 공백 차이입니다. –

+0

@ JohnWeldon : 전체 내용은 대학 과정을위한 CBC 구현입니다. 이 부분은 MAC 태그를 생성하는 코드 섹션입니다. 첫 번째 실행에서 암호화 시작시 PCSSHA256이 호출됩니다. 약간의 패딩이 주어지면 메시지에 연결되고 파일에 덤프되기 전에 AES로 밀어 넣습니다. 두 번째 실행에서 해당 파일을 읽고 마지막에 PCSSHA256이 해독 된 메시지에 대해 실행되고 결과가 해독 된 메시지와 함께 제공된 태그와 비교됩니다. 나는 이미 메시지가 동일하고 kmac도 동일하다는 것을 확인했다. –

답변

0

답변 : 제 코드에 문제가 있습니다. 내 메시지는 16 진수로 변환 될 때 두 번째 경우에 8 개의 추가 0으로 채워집니다.이 패딩은 문자열로 인쇄 할 때 보이지 않습니다.

관련 문제