package main import ( "crypto/aes" "crypto/cipher" "crypto/md5" "crypto/rand" "fmt" "io" "io/ioutil" "os" ) func checkErr(err error) { if err != nil { panic(err.Error()) } } func keyMkr(passwd string) []byte { key := md5.New() key.Write([]byte(passwd)) return key.Sum(nil) } func encrypt(data []byte, key []byte) []byte { block, err := aes.NewCipher(key) checkErr(err) gcm, err := cipher.NewGCM(block) checkErr(err) nonce := make([]byte, gcm.NonceSize()) _ , err= io.ReadFull(rand.Reader, nonce) checkErr(err) sealed := gcm.Seal(nonce, nonce, data, nil) return sealed } func decrypt(sealed []byte, key []byte) []byte { block, err := aes.NewCipher(key) checkErr(err) gcm, err := cipher.NewGCM(block) nonceSize := gcm.NonceSize() nonce, ctxt := sealed[:nonceSize], sealed[nonceSize:] data, err := gcm.Open(nil, nonce, ctxt, nil) checkErr(err) return data } func file2data(filename string) []byte { data, err := ioutil.ReadFile(filename) checkErr(err) return data } func data2file(filename string, data []byte) { f, err := os.Create(filename) checkErr(err) defer f.Close() f.Write(data) } func main() { var passwd string = "ThisAnnPassphrase" fmt.Println(passwd) key := keyMkr(passwd) fmt.Println(string(key)) data := []byte("Thi is some data") fmt.Println(string(data)) fmt.Println("encryption:") dataSealed := encrypt(data,key) fmt.Println(string(dataSealed)) fmt.Println("decryption:") fmt.Println(string(decrypt(dataSealed,key))) }