Last active
October 18, 2023 03:12
-
-
Save manishtpatel/8222606 to your computer and use it in GitHub Desktop.
GoLang Encrypt string to base64 and vice versa using AES encryption.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"crypto/aes" | |
"crypto/cipher" | |
"crypto/rand" | |
"encoding/base64" | |
"fmt" | |
"io" | |
) | |
func main() { | |
originalText := "encrypt this golang" | |
fmt.Println(originalText) | |
key := []byte("example key 1234") | |
// encrypt value to base64 | |
cryptoText := encrypt(key, originalText) | |
fmt.Println(cryptoText) | |
// encrypt base64 crypto to original value | |
text := decrypt(key, cryptoText) | |
fmt.Printf(text) | |
} | |
// encrypt string to base64 crypto using AES | |
func encrypt(key []byte, text string) string { | |
// key := []byte(keyText) | |
plaintext := []byte(text) | |
block, err := aes.NewCipher(key) | |
if err != nil { | |
panic(err) | |
} | |
// The IV needs to be unique, but not secure. Therefore it's common to | |
// include it at the beginning of the ciphertext. | |
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) | |
// convert to base64 | |
return base64.URLEncoding.EncodeToString(ciphertext) | |
} | |
// decrypt from base64 to decrypted string | |
func decrypt(key []byte, cryptoText string) string { | |
ciphertext, _ := base64.URLEncoding.DecodeString(cryptoText) | |
block, err := aes.NewCipher(key) | |
if err != nil { | |
panic(err) | |
} | |
// The IV needs to be unique, but not secure. Therefore it's common to | |
// include it at the beginning of the ciphertext. | |
if len(ciphertext) < aes.BlockSize { | |
panic("ciphertext too short") | |
} | |
iv := ciphertext[:aes.BlockSize] | |
ciphertext = ciphertext[aes.BlockSize:] | |
stream := cipher.NewCFBDecrypter(block, iv) | |
// XORKeyStream can work in-place if the two arguments are the same. | |
stream.XORKeyStream(ciphertext, ciphertext) | |
return fmt.Sprintf("%s", ciphertext) | |
} |
A note: the key (line 30) should be 16, 24 or 32 byte when creating new cipher (line 32), as reported in https://golang.org/src/crypto/aes/cipher.go
Thank you for this package, helped me a lot!
Thank you for the code!
I wrapped this code in a package if anyone cares to use it or help contribute: https://github.com/blaskovicz/go-cryptkeeper.
It provides types.Encrypt()
, types.Decrypt(), and a
types.CryptStringstruct that can be used for database
Scan()/
Value()and
MarshalJSON()` operations.
how to GoLang Encrypt string to base64 and vice versa using AES encryption with javascript
This package is wrong, don't use this anywhere!
I wouldn't recommend using URL encoding as it will replace / with _ for example which will not work across different systems.
base64.StdEncoding.EncodeToString
is much better for cross system encoding.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I would move from using AES directly to using the Cipher package similar to what's done in https://gist.github.com/kkirsche/e28da6754c39d5e7ea10 based on feedback from the Golang team when I proposed including an example of proper AES encryption in the examples.