16790


Golangで3つの[32]byte型の変数

[code]

    a := sha256.Sum256("aaaa")
    b := sha256.Sum256("bbbb")
    c := sha256.Sum256("cccc")
    
[/code]

を連結して更にsha256を計算したいです。  
要するに`d := sha256.Sum256(a+b+c)`にようなことをしたいです。  
普通に`bytes.Join`を使ってみましたが、[]byteと[32]byteは型が違うのでできないとエラーが出てしまいました。

どのように連結したハッシュ値を求めればいいのでしょうか。


CC BY-SA 3.0
2015-09-20T05:49:37.543
16789
2015-09-20T09:01:47.750
7232
question
go
Golangでsha256のバイト同士を連結してハッシュ化したい。


a, b, cの連結は`append(append(a[:], b[:]...),
c[:]...)`で可能ですが、連結したハッシュを求めたい場合は`Write`を使ったほうが事前に連結する必要がないので便利です。

[code]

    package main
    
    import (
        "crypto/sha256"
        "fmt"
    )
    
    func main() {
        a := sha256.Sum256([]byte("aaaa"))
        b := sha256.Sum256([]byte("bbbb"))
        c := sha256.Sum256([]byte("cccc"))
    
        hash := sha256.New()
        hash.Write(a[:])
        hash.Write(b[:])
        hash.Write(c[:])
    
        d := hash.Sum(nil)
        fmt.Println(d)
    }
    
[/code]


CC BY-SA 3.0
2015-09-20T06:13:54.533
16790
2015-09-20T06:13:54.533
3639
16789
answer


それでは別解を。個々のメッセージダイジェストを文字列(hex string)に変換して結合、`[]byte`
型に戻して全体のメッセージダイジェストを求めています。

[code]

    package main
    
    import (
        "crypto/sha256"
        "encoding/hex"
        "fmt"
    )
    
    func main() {
    
        a := fmt.Sprintf("%x", sha256.Sum256([]byte("aaaa")))
        b := fmt.Sprintf("%x", sha256.Sum256([]byte("bbbb")))
        c := fmt.Sprintf("%x", sha256.Sum256([]byte("cccc")))
    
        h, _ := hex.DecodeString(a + b + c)
        sum := sha256.Sum256(h)
    
        fmt.Printf("sum = %v\nsum(hex) = %s\n", sum, fmt.Sprintf("%x", sum))
    }
    
[/code]


CC BY-SA 3.0
2015-09-20T09:01:47.750
16798
2015-09-20T09:01:47.750
16789
answer