Commit 74f41102fa4459906386b25da03c10a5c200211f
0 parents
Exists in
master
first commit
Showing
2 changed files
with
71 additions
and
0 deletions
Show diff stats
README.md
File was created | 1 | ### Link to the original source: [Advanced encryption and decryption](https://astaxie.gitbooks.io/build-web-application-with-golang/content/en/09.6.html) | |
2 |
main.go
File was created | 1 | package aes | |
2 | |||
3 | import ( | ||
4 | "crypto/aes" | ||
5 | "crypto/cipher" | ||
6 | "crypto/rand" | ||
7 | "errors" | ||
8 | "io" | ||
9 | mrand "math/rand" | ||
10 | "time" | ||
11 | ) | ||
12 | |||
13 | const ( | ||
14 | keySize = 32 | ||
15 | allowedRunes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" | ||
16 | ) | ||
17 | |||
18 | // RandomKey returns a randomly generated 32 bytes long hex encoded key. | ||
19 | func RandomKey() (key []byte) { | ||
20 | mrand.Seed(time.Now().UnixNano()) | ||
21 | |||
22 | key = make([]byte, keySize) | ||
23 | |||
24 | for i := range key { | ||
25 | key[i] = allowedRunes[mrand.Intn(len(allowedRunes))] | ||
26 | } | ||
27 | |||
28 | return key | ||
29 | } | ||
30 | |||
31 | // Encrypt encrypts plaintext with key and returns resulting bytes. | ||
32 | func Encrypt(plaintext []byte, key []byte) ([]byte, error) { | ||
33 | c, err := aes.NewCipher(key) | ||
34 | if err != nil { | ||
35 | return nil, err | ||
36 | } | ||
37 | |||
38 | gcm, err := cipher.NewGCM(c) | ||
39 | if err != nil { | ||
40 | return nil, err | ||
41 | } | ||
42 | |||
43 | nonce := make([]byte, gcm.NonceSize()) | ||
44 | if _, err = io.ReadFull(rand.Reader, nonce); err != nil { | ||
45 | return nil, err | ||
46 | } | ||
47 | |||
48 | return gcm.Seal(nonce, nonce, plaintext, nil), nil | ||
49 | } | ||
50 | |||
51 | // Decrypt decrypts ciphertext with key and returns resulting bytes. | ||
52 | func Decrypt(ciphertext []byte, key []byte) ([]byte, error) { | ||
53 | c, err := aes.NewCipher(key) | ||
54 | if err != nil { | ||
55 | return nil, err | ||
56 | } | ||
57 | |||
58 | gcm, err := cipher.NewGCM(c) | ||
59 | if err != nil { | ||
60 | return nil, err | ||
61 | } | ||
62 | |||
63 | nonceSize := gcm.NonceSize() | ||
64 | if len(ciphertext) < nonceSize { | ||
65 | return nil, errors.New("ciphertext too short") | ||
66 | } | ||
67 | |||
68 | nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:] | ||
69 | return gcm.Open(nil, nonce, ciphertext, nil) | ||
70 | } | ||
71 |