やりたいこと
GolangでHashChainを作成し、それを検証するコードを書いています。
Goで4つの要素(ブロック)からなるハッシュチェーンを実装しています。
まずArrayに4つの要素を準備し、一つ目をハッシュ化します。2つ目以降の要素は前のハッシュとその要素を足してハッシュ化していきます。
このハッシュチェーン自体は実装できたのですが、この検証の段階で予期せぬ挙動が現れており、困っています。
検証とは、作成されたハッシュが入力要素と前のハッシュの値から成っているかどうかを確かめる過程です。
これを、i=3から遡って検証していく実装を目指しています。
コード
実際に書いたコードは次のようなものです
package main import ( "crypto/sha256" "fmt" "reflect" ) func main() { createHashChain() } func HashChain() { Array := [...]string{"0001", "0002", "0003", "0004"} h := sha256.New() //構造体を定義 type Block struct { Index int Data string Hash []byte } //構造体配列を定義 type BlockArray []*Block var hashChain BlockArray //Hashchainの作成 for i := 0; i < len(Array); i++ { if i == 0 { h.Write([]byte(Array[i])) hashChain = append(hashChain, &Block{i, Array[i], h.Sum(nil)}) fmt.Printf("Array %x = %x \n", i, []byte(Array[i])) fmt.Printf("Block %x Hash = %x \n", i, hashChain[i].Hash) fmt.Printf("------------------------------------------------------------------------------------- \n") } else { message := append([]byte(Array[i]), hashChain[i-1].Hash...) fmt.Printf("Array %x = %x \n", i, []byte(Array[i])) fmt.Printf("Block %x Hash = %x \n", i-1, hashChain[i-1].Hash) h.Write([]byte(message)) hashChain = append(hashChain, &Block{i, Array[i], h.Sum(nil)}) fmt.Printf("Block %x Hash = %x \n", i, hashChain[i].Hash) fmt.Printf("-------------------------------------------------------------------------------- \n") } } fmt.Printf("================================================================================\n") //HashChainの検証 for i := len(hashChain) - 1; i >= 0; i-- { fmt.Printf("Array %x = %x \n", i, []byte(Array[i])) if i == 0 { h.Write([]byte(Array[i])) fmt.Printf("Block %x Hash = %x \n", i, hashChain[i].Hash) } else { fmt.Printf("Block %x Hash = %x \n", i-1, hashChain[i-1].Hash) message := append([]byte(Array[i]), hashChain[i-1].Hash...) h.Write([]byte(message)) fmt.Printf("Block %x Hash = %x \n", i, h.Sum(nil)) } if reflect.DeepEqual(hashChain[i].Hash, h.Sum(nil)) { fmt.Printf("Block %x is valid \n", i) } else { fmt.Printf("Block %x is invalid \n", i) } fmt.Printf("-------------------------------------------------------------------------------- \n") } }
実行結果
出力から、以下のことがわかりました
- ハッシュチェーンは実装できている
- 検証の際に、要素と前のハッシュのペアは間違っていない
- しかし、このペアから出力されるハッシュの値は、作成されたhashchainのそれと一致しない
Array 0 = 30303031 Block 0 Hash = 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 ------------------------------------------------------------------------------------- Array 1 = 30303032 Block 0 Hash = 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 Block 1 Hash = 6dac394913764d4e0c4beed3aae22375fa8692079798d7dd6502e132935311d3 -------------------------------------------------------------------------------- Array 2 = 30303033 Block 1 Hash = 6dac394913764d4e0c4beed3aae22375fa8692079798d7dd6502e132935311d3 Block 2 Hash = fe93f79a1f6ac296c29bd9c14bdc9663ad919e70ef3111b64b37949eddd63e4b -------------------------------------------------------------------------------- Array 3 = 30303034 Block 2 Hash = fe93f79a1f6ac296c29bd9c14bdc9663ad919e70ef3111b64b37949eddd63e4b Block 3 Hash = 77693c0422e8e2f5fb5cec27e6ccac0ebc6eff93655ae9fd7e983332ba59ca26 -------------------------------------------------------------------------------- ================================================================================ Array 3 = 30303034 Block 2 Hash = fe93f79a1f6ac296c29bd9c14bdc9663ad919e70ef3111b64b37949eddd63e4b Block 3 Hash = 2bb9d7434a81d0174832beb2d6f1199e6684d4059c3f3ee80985a656cf292530 Block 3 is invalid -------------------------------------------------------------------------------- Array 2 = 30303033 Block 1 Hash = 6dac394913764d4e0c4beed3aae22375fa8692079798d7dd6502e132935311d3 Block 2 Hash = 5f3fb52d22ad38f461277d051da01a493e6d58ffae22e3785463baa78fd575c9 Block 2 is invalid -------------------------------------------------------------------------------- Array 1 = 30303032 Block 0 Hash = 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 Block 1 Hash = 39bccdb509a3c3024cee6eaa59c97b304cc0b09008cfeff124b2eeddf58df1cd Block 1 is invalid -------------------------------------------------------------------------------- Array 0 = 30303031 Block 0 Hash = 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 Block 0 is invalid --------------------------------------------------------------------------------
sha256は暗号学的ハッシュ関数なので、入力値が同じならば出力されるハッシュ値は常に同じになるはずですが、この通りの結果になっています。
直接的な解決方法でなくても何かの基礎的知識が抜けているのであれば、そのあたりをご指摘もらえると幸甚です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/11 15:01
2021/09/11 15:01
2021/09/11 19:30