Sling Academy
Home/Golang/Introduction to Cryptography in Go

Introduction to Cryptography in Go

Last updated: November 27, 2024

Cryptography is an essential part of securing digital communications. Go, also known as Golang, provides a robust set of cryptographic libraries in its standard library that allows developers to implement various cryptographic functions easily. In this article, we'll introduce some basic cryptographic concepts and demonstrate how to use them in Go.

Understanding Basic Cryptographic Concepts

Before diving into the code, let’s review some fundamental concepts:

  • Encryption: A process of converting data into a format that cannot be easily interpreted by unauthorized people.
  • Decryption: The process of converting encrypted data back to its original form.
  • Symmetric Cryptography: Uses a single key for both encryption and decryption.
  • Asymmetric Cryptography: Uses a pair of keys, a public key for encryption and a private key for decryption.
  • Hash Functions: A technique to generate a fixed-size string or hash from input data of any size, which is irreversible.

Getting Started with Cryptography in Go

Go's standard library includes several packages for cryptography, such as crypto/aes, crypto/rsa, crypto/sha256, etc. Let's explore some examples:

Symmetric Encryption with AES

AES (Advanced Encryption Standard) is a symmetric encryption algorithm. Here’s how you can use AES encryption in Go:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/hex"
    "fmt"
    "io"
)

func encrypt(text, key string) (string, error) {
    block, err := aes.NewCipher([]byte(key))
    if err != nil {
        return "", err
    }

    ciphertext := make([]byte, aes.BlockSize+len(text))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return "", err
    }

    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], []byte(text))

    return hex.EncodeToString(ciphertext), nil
}

func main() {
    key := "examplekey123456" // 16 bytes for AES-128
    plaintext := "Hello, Go!"

    encrypted, err := encrypt(plaintext, key)
    if err != nil {
        fmt.Println("Error encrypting text:", err)
        return
    }

    fmt.Printf("Encrypted: %s\n", encrypted)
}

This example outputs the encrypted form of the text Hello, Go! using a symmetric key.

Hashing with SHA-256

SHA-256 is a widely-used cryptographic hash function. Here's how to implement it in Go:

package main

import (
    "crypto/sha256"
    "fmt"
)

func main() {
    text := "Hello, Go!"
    hash := sha256.New()
    hash.Write([]byte(text))
    hashed := hash.Sum(nil)

    fmt.Printf("SHA-256 Hash: %x\n", hashed)
}

This code generates a SHA-256 hash of the input string "Hello, Go!" and prints it in hexadecimal format.

Asymmetric Encryption with RSA

For asymmetric encryption, Go has built-in support for RSA. Here’s an example of how to encrypt and decrypt text using RSA:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha256"
    "fmt"
    "log"
)

func main() {
    message := []byte("Hello, RSA!")

    // Generate RSA keys
    privKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        log.Fatal(err)
    }

    pubKey := &privKey.PublicKey

    // Encrypt message
    ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, pubKey, message, nil)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Encrypted message: %x\n", ciphertext)

    // Decrypt message
    plaintext, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privKey, ciphertext, nil)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Decrypted message: %s\n", plaintext)
}

This example demonstrates the encryption and decryption process using RSA and OAEP padding with SHA-256.

Conclusion

Go provides extensive support for cryptography through its standard library, making it straightforward to incorporate powerful encryption, decryption, and hashing capabilities into your applications. The examples covered in this article should serve as a good start toward understanding and implementing cryptography in your Go projects. Practice and familiarization with Go's cryptographic libraries will enable you to build more secure applications.

Next Article: Hashing Passwords Securely with `bcrypt` in Go

Series: Cryptography and Security in Go

Golang

Related Articles

You May Also Like

  • How to remove HTML tags in a string in Go
  • How to remove special characters in a string in Go
  • How to remove consecutive whitespace in a string in Go
  • How to count words and characters in a string in Go
  • Relative imports in Go: Tutorial & Examples
  • How to run Python code with Go
  • How to generate slug from title in Go
  • How to create an XML sitemap in Go
  • How to redirect in Go (301, 302, etc)
  • Using Go with MongoDB: CRUD example
  • Auto deploy Go apps with CI/ CD and GitHub Actions
  • Fixing Go error: method redeclared with different receiver type
  • Fixing Go error: copy argument must have slice type
  • Fixing Go error: attempted to use nil slice
  • Fixing Go error: assignment to constant variable
  • Fixing Go error: cannot compare X (type Y) with Z (type W)
  • Fixing Go error: method has pointer receiver, not called with pointer
  • Fixing Go error: assignment mismatch: X variables but Y values
  • Fixing Go error: array index must be non-negative integer constant