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に渡された。
私はあなたのコードを少し微調整し、同じ入力で2回実行するために 'main()'を追加しました...あなたが実際に渡しているものを反映するために 'main()'を変更できますか? https://play.golang.org/p/ujHtWeZNWE –
この機能に送信しているものにバグがあると思われます。私の推測は、ファイルやマーシャリングや何かを読む際の何らかの空白の違いです。 –
@JohnWeldon:全体が大学コースのCBC実装です。この部分は、MACタグを生成するコードのセクションです。 最初の実行では、暗号化の開始時にPCSSHA256が呼び出されます。いくつかのパディングを与えられたメッセージに連結され、ファイルにダンプされる前にAESに挿入されます。 2回目の実行では、そのファイルが読み取られ、最後に解読されたメッセージに対してPCSSHA256が実行され、解読されたメッセージに付随するタグと比較されます。 私は既にメッセージが同じで、kmacも同じであることを確認しました。 –