=Start=
缘由:
最近在跟着郝林老师的《Go语言核心36讲》这门课程重拾Go语言学习(之前在15年的时候我自学过一段时间,不过后来没怎么用Go来写代码,所以有些内容都忘了,这次希望能坚持下去),所以准备把一些常见功能用Go语言试着实践一遍,加强学习效果和对这门语言的感觉。
正文:
参考解答:
Go 语言中如何对字符串进行SHA-1/MD5等Hash操作?
package main import ( "crypto/sha1" "encoding/hex" "fmt" "io" ) func main() { // 不论是sha1还是md5,求Hash都是先 New() 然后再 Write() 最后 Sum() s := "hash this string" h := sha1.New() h.Write([]byte(s)) fmt.Printf("%x\n", h.Sum(nil)) // sha1_hash := hex.EncodeToString(h.Sum(nil)) // fmt.Println(sha1_hash) fmt.Println(hex.EncodeToString(h.Sum(nil))) // 使用 io.WriteString 将字符串写入,而不是用 []byte(string_here) 进行转换 h5 := sha1.New() io.WriteString(h5, "hash this string") fmt.Printf("%x\n", h5.Sum(nil)) }
Go 语言中如何对文件进行SHA-1/MD5等Hash操作?
package main import ( "crypto/sha1" "fmt" "io" "log" "os" ) func main() { f, err := os.Open("file.txt") if err != nil { log.Fatal(err) } defer f.Close() h := sha1.New() if _, err := io.Copy(h, f); err != nil { log.Fatal(err) } fmt.Printf("%x", h.Sum(nil)) }
Go 语言中如何对字符串进行AES加解密?
package main import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/base64" "errors" "fmt" "io" "log" ) func main() { key := []byte("a very very very very secret key") // 32 bytes plaintext := []byte("some really really really long plaintext") fmt.Printf("%s\n", plaintext) ciphertext, err := encrypt(key, plaintext) if err != nil { log.Fatal(err) } fmt.Printf("%0x\n", ciphertext) result, err := decrypt(key, ciphertext) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", result) } // See alternate IV creation from ciphertext below //var iv = []byte{35, 46, 57, 24, 85, 35, 24, 74, 87, 35, 88, 98, 66, 32, 14, 05} func encrypt(key, text []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } b := base64.StdEncoding.EncodeToString(text) ciphertext := make([]byte, aes.BlockSize+len(b)) iv := ciphertext[:aes.BlockSize] if _, err := io.ReadFull(rand.Reader, iv); err != nil { return nil, err } cfb := cipher.NewCFBEncrypter(block, iv) cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b)) return ciphertext, nil } func decrypt(key, text []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } if len(text) < aes.BlockSize { return nil, errors.New("ciphertext too short") } iv := text[:aes.BlockSize] text = text[aes.BlockSize:] cfb := cipher.NewCFBDecrypter(block, iv) cfb.XORKeyStream(text, text) data, err := base64.StdEncoding.DecodeString(string(text)) if err != nil { return nil, err } return data, nil }
Go 语言中如何对字符串进行base64编解码?
- func (enc *Encoding) EncodeToString(src []byte) string
- func (enc *Encoding) DecodeString(s string) ([]byte, error)
package main import ( "encoding/base64" "fmt" ) func main() { msg := "Hello, 世界" // base64 编码 encoded := base64.StdEncoding.EncodeToString([]byte(msg)) fmt.Println(encoded) // SGVsbG8sIOS4lueVjA== // base64 解码 decoded, err := base64.StdEncoding.DecodeString(encoded) if err != nil { fmt.Println("decode error:", err) return } fmt.Println(string(decoded)) // Hello, 世界 }
参考链接:
- Go 语言中如何对字符串进行AES加解密和base64编码?
- Go 语言中如何对字符串进行SHA-1哈希操作?
- Go 语言中如何对字符串进行MD5哈希操作?
- http://golang.org/pkg/crypto/md5/#New
=END=
《“Go语言学习#3-加解密、哈希操作”》 有 1 条评论
GO加密解密之RSA
http://blog.studygolang.com/2013/01/go%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86%E4%B9%8Brsa/
https://github.com/polaris1119/myblog_article_code/blob/master/rsa/rsa.go