1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| package main
import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/base64" "fmt" "io" )
func main() { text := "Hello, World!" key := []byte("1234567890123456")
encrypted := encrypt(key, text) fmt.Println(encrypted)
decrypted := decrypt(key, encrypted) fmt.Println(decrypted) }
func encrypt(key []byte, text string) string { plaintext := []byte(text) block, err := aes.NewCipher(key) if err != nil { panic(err) } ciphertext := make([]byte, aes.BlockSize+len(plaintext)) iv := ciphertext[:aes.BlockSize] if _, err := io.ReadFull(rand.Reader, iv); err != nil { panic(err) } stream := cipher.NewCFBEncrypter(block, iv) stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext) return base64.StdEncoding.EncodeToString(ciphertext) }
func decrypt(key []byte, cryptoText string) string { ciphertext, _ := base64.StdEncoding.DecodeString(cryptoText) block, err := aes.NewCipher(key) if err != nil { panic(err) } if len(ciphertext) < aes.BlockSize { panic("ciphertext too short") } iv := ciphertext[:aes.BlockSize] ciphertext = ciphertext[aes.BlockSize:] stream := cipher.NewCFBDecrypter(block, iv) stream.XORKeyStream(ciphertext, ciphertext) return fmt.Sprintf("%s", ciphertext) }
|