1. 程式人生 > >Go語言實現單向雜湊函式 —— MD5訊息摘要演算法、SHA256與224(Go語言實現)

Go語言實現單向雜湊函式 —— MD5訊息摘要演算法、SHA256與224(Go語言實現)

 MD5訊息摘要演算法

MD5訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。

Go語言實現方式一:

package main

import (
	"fmt"
	"crypto/md5"
	"encoding/hex"
)

func main() {

	var a = []byte("i am the reader")

	hash := md5.New()
	_, err := hash.Write(a)
	if err!=nil{
		fmt.Println("hash.Write faild")
	}
	hashed := hash.Sum(nil)
	fmt.Println("a 的md5單向雜湊為:",hex.EncodeToString(hashed[:]))
	
	hash.Reset()
	_, err= hash.Write([]byte("hello world"))
	if err!=nil{
		fmt.Println("hash.Write faild")
	}
	hashed = hash.Sum(nil)
	fmt.Println("a 的md5單向雜湊為:",hex.EncodeToString(hashed[:]))
	
}

Go語言實現方式二:

package main

import (
	"fmt"
	"crypto/md5"
	"encoding/hex"
)



func main() {
	hashed := md5.Sum([]byte("i am the reader"))
	fmt.Println("a 的md5單向雜湊為:",hex.EncodeToString(hashed[:]))
}

其兩者區別為:用過一次之後可以reset以下,然後可以重複使用,而方式二不可以。

方式一程式碼比較多,而方式二程式碼就很少。

SHA256與224

package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

func main1() {
	hash := sha256.New()
	hash.Write([]byte("i am the reader"))
	sum := hash.Sum(nil)
	fmt.Println(sum)
	fmt.Println(len(sum) * 8)
	s := hex.EncodeToString(sum)
	fmt.Println(s)
	fmt.Println(len(s) * 8)
}

//結果為:
//[84 251 192 78 28 190 247 247 180 155 4 177 16 2 249 160 236 10 217 96 213 242 65 37 24 13 212 58 232 98 129 229]
//256
//54fbc04e1cbef7f7b49b04b11002f9a0ec0ad960d5f24125180dd43ae86281e5
//512
func main2() {
	s1 := sha256.Sum256([]byte("i am the reader"))
	fmt.Println(len(s1) * 8)
	fmt.Println(s1)
	s := hex.EncodeToString(s1[:])

	fmt.Println(s)
	fmt.Println(len(s) * 8)
}
//結果為:
//256
//[84 251 192 78 28 190 247 247 180 155 4 177 16 2 249 160 236 10 217 96 213 242 65 37 24 13 212 58 232 98 129 229]
//54fbc04e1cbef7f7b49b04b11002f9a0ec0ad960d5f24125180dd43ae86281e5
//512


func main3() {
	hash := sha256.New224()
	hash.Write([]byte("i am the reader"))
	sum := hash.Sum(nil)
	fmt.Println(sum)
	fmt.Println(len(sum) * 8)
	s := hex.EncodeToString(sum)
	fmt.Println(s)
	fmt.Println(len(s) * 8)
}

//結果為:
//[249 203 73 14 85 217 122 47 50 255 162 90 1 24 181 52 4 26 201 18 73 182 159 29 205 205 201 208]
//224
//f9cb490e55d97a2f32ffa25a0118b534041ac91249b69f1dcdcdc9d0
//448