2017-10-04 11 views
0

Golangのcrypto/sha256パッケージに問題があります。私は同じ入力をsha256.Sum256に2回に分けて送信しており、毎回出力が異なります。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が2つの入力に対して異なるのか混乱します。

sha256.Sum256は決定的で、特定の入力に対して同じ出力を返すことが期待されています。これはGo Playgroundでテストしましたが、実際には同じことが返されています。私のコードやSum256の内部動作についての私の理解と一緒に。誰かが私が間違っていることを説明できるなら、それは非常に感謝します。

ありがとうございます。

EDITS: - AESを介して最初の実行では、PCSSHA256関数へのメッセージ入力を直接ioutil.ReadFileを(使用して、ファイルから読み込まれる)は、第2の実行時に、暗号化されたメッセージは、最初のブロックごとに処理されながら次いでPCSSHA256に渡された。

+0

私はあなたのコードを少し微調整し、同じ入力で2回実行するために 'main()'を追加しました...あなたが実際に渡しているものを反映するために 'main()'を変更できますか? https://play.golang.org/p/ujHtWeZNWE –

+1

この機能に送信しているものにバグがあると思われます。私の推測は、ファイルやマーシャリングや何かを読む際の何らかの空白の違いです。 –

+0

@JohnWeldon:全体が大学コースのCBC実装です。この部分は、MACタグを生成するコードのセクションです。 最初の実行では、暗号化の開始時にPCSSHA256が呼び出されます。いくつかのパディングを与えられたメッセージに連結され、ファイルにダンプされる前にAESに挿入されます。 2回目の実行では、そのファイルが読み取られ、最後に解読されたメッセージに対してPCSSHA256が実行され、解読されたメッセージに付随するタグと比較されます。 私は既にメッセージが同じで、kmacも同じであることを確認しました。 –

答えて

0

回答:私のコードに問題があります。私のメッセージは、16進数に変換されたときに2番目のケースで8個の余分な0で埋められます。このパディングは文字列として表示されても表示されません。

関連する問題