-
-
Save manishtpatel/8222606 to your computer and use it in GitHub Desktop.
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) | |
} |
how can I decrypt from node.js ? any suggestions ?
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.
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.
Updated to use UrlEncoding instead of StdEncoding. I see that UrlEncoding has broader usage, atleast i need it.