2017-10-04 1 views
0

Ich habe ein Problem mit Golangs crypto/sha256 Paket. Ich sende die gleiche Eingabe zweimal an sha256.Sum256, und die Ausgabe ist jedes Mal anders.Golang crypto/sha256 - gleiche Eingaben erzeugen unterschiedliche Ausgänge

Mein Code ist folgende:

//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 
} 

Unten ist die fmt.Printf Ausgang für den ersten Lauf:

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

Und hier ist der Ausgang für den zweiten Lauf:

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

In beiden Ausgaben ist alles identisch mit Ausnahme von Firsthashvalue und dem resultierenden Tag. Da tohashinnerwmess (eine Variable, die ich nur verwende, um herauszufinden, was schief läuft) in beiden Fällen äquivalent ist und nur in sha256.Sum256 eingespeist wird, bin ich verwirrt, warum der Firsthash-Wert für die beiden Eingaben unterschiedlich ist.

Ich bin ziemlich sicher, dass sha256.Sum256 ist deterministisch und wird erwartet, dass die gleiche Ausgabe für eine gegebene Eingabe zurückgeben - getestet dies in der Go Playground, und tatsächlich gab es das gleiche - so nehme ich an, das Problem liegt entweder mit meinem Code oder meinem Verständnis von Sum256's Innenleben. Wenn jemand erklären könnte, was ich falsch mache, würde das sehr geschätzt werden.

Vielen Dank.

EDITS: - Bei der ersten Ausführung wird die in der Funktion PCSSHA256 eingegebene Nachricht direkt aus einer Datei mit ioutil.ReadFile() gelesen, während beim zweiten Lauf eine verschlüsselte Nachricht zuerst blockweise über AES und verarbeitet wird dann an PCSSHA256 übergeben.

+0

Ich habe ein paar Änderungen an Ihrem Code vorgenommen und ein 'main()' hinzugefügt, um es zweimal mit den gleichen Eingaben auszuführen ... können Sie die 'main()' so ändern, dass sie die tatsächlich übergebenen Werte wiedergibt? https://play.golang.org/p/ujHtWeZNWE –

+1

Ich vermute, es gibt einen Fehler in dem, was Sie an diese Funktion senden. Meine Vermutung ist eine Art von Leerzeichen Unterschied beim Lesen in Dateien oder Marshalling oder etwas –

+0

@ JohnWeldon: Das Ganze ist eine CBC-Implementierung für einen Universitätskurs. Dieser Teil ist der Codeabschnitt, der das MAC-Tag generiert. Beim ersten Start wird PCSSHA256 beim Start von encrypt aufgerufen. Es wird auf eine Nachricht verkettet, mit einem Padding versehen und dann in AES geschoben, bevor es in eine Datei ausgegeben wird. Beim zweiten Durchlauf wird diese Datei gelesen, und am Ende wird PCSSHA256 auf der entschlüsselten Nachricht ausgeführt, und das Ergebnis wird mit dem Tag verglichen, das mit der entschlüsselten Nachricht geliefert wurde. Ich habe bereits bestätigt, dass die Nachricht die gleiche ist, und der kmac ist auch gleich. –

Antwort

0

Antwort: Es ist ein Problem mit meinem Code. Meine Nachricht wird im zweiten Fall um 8 zusätzliche 0s aufgefüllt, wenn sie in Hex umgewandelt wird - diese Auffüllung ist nicht sichtbar, wenn sie als Zeichenfolge gedruckt wird.

Verwandte Themen