grsa

package
v2.10.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 14, 2026 License: MIT Imports: 9 Imported by: 0

README

GoFrame RSA Package

Package grsa provides useful API for RSA encryption/decryption algorithms within the GoFrame framework.

Features

  • Generating RSA key pairs in PKCS#1 and PKCS#8 formats
  • Encrypting and decrypting data with various key formats
  • Handling Base64 encoded keys
  • Detecting private key types
  • Plaintext size validation
  • OAEP padding support (recommended for new applications)

Security Considerations

This package provides two padding schemes for RSA encryption:

1. PKCS#1 v1.5 (Legacy)

Used by Encrypt*, DecryptPKCS1*, DecryptPKCS8* functions.

⚠️ Security Warning: PKCS#1 v1.5 padding is considered less secure and vulnerable to padding oracle attacks. It is provided for backward compatibility with existing systems.

Used by EncryptOAEP*, DecryptOAEP* functions.

Recommended: OAEP (Optimal Asymmetric Encryption Padding) provides better security guarantees and should be used for all new applications.

Quick Start

package main

import (
    "fmt"
    "github.com/gogf/gf/v2/crypto/grsa"
)

func main() {
    // Generate a default RSA key pair (2048 bits)
    privateKey, publicKey, err := grsa.GenerateDefaultKeyPair()
    if err != nil {
        panic(err)
    }

    // Data to encrypt
    plainText := []byte("Hello, World!")

    // Encrypt with public key using OAEP (recommended)
    cipherText, err := grsa.EncryptOAEP(plainText, publicKey)
    if err != nil {
        panic(err)
    }

    // Decrypt with private key using OAEP
    decryptedText, err := grsa.DecryptOAEP(cipherText, privateKey)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(decryptedText)) // Output: Hello, World!
}
Legacy Encryption/Decryption (PKCS#1 v1.5)
package main

import (
    "fmt"
    "github.com/gogf/gf/v2/crypto/grsa"
)

func main() {
    // Generate a default RSA key pair (2048 bits)
    privateKey, publicKey, err := grsa.GenerateDefaultKeyPair()
    if err != nil {
        panic(err)
    }

    // Data to encrypt
    plainText := []byte("Hello, World!")

    // Encrypt with public key (PKCS#1 v1.5 - legacy)
    cipherText, err := grsa.Encrypt(plainText, publicKey)
    if err != nil {
        panic(err)
    }

    // Decrypt with private key
    decryptedText, err := grsa.Decrypt(cipherText, privateKey)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(decryptedText)) // Output: Hello, World!
}
Working with Base64 Encoded Keys
package main

import (
    "encoding/base64"
    "fmt"
    "github.com/gogf/gf/v2/crypto/grsa"
)

func main() {
    // Generate a key pair
    privateKey, publicKey, err := grsa.GenerateDefaultKeyPair()
    if err != nil {
        panic(err)
    }

    // Encode keys to Base64
    privateKeyBase64 := base64.StdEncoding.EncodeToString(privateKey)
    publicKeyBase64 := base64.StdEncoding.EncodeToString(publicKey)

    // Data to encrypt
    plainText := []byte("Hello, Base64 World!")

    // Encrypt with Base64 encoded public key using OAEP (recommended)
    cipherTextBase64, err := grsa.EncryptOAEPBase64(plainText, publicKeyBase64)
    if err != nil {
        panic(err)
    }

    // Decrypt with Base64 encoded private key using OAEP
    decryptedText, err := grsa.DecryptOAEPBase64(cipherTextBase64, privateKeyBase64)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(decryptedText)) // Output: Hello, Base64 World!
}

Functions

Key Generation
  • GenerateKeyPair(bits int): Generates a new RSA key pair with the given bits in PKCS#1 format
  • GenerateKeyPairPKCS8(bits int): Generates a new RSA key pair with the given bits in PKCS#8 format
  • GenerateDefaultKeyPair(): Generates a new RSA key pair with default bits (2048) in PKCS#1 format
  • EncryptOAEP(plainText, publicKey []byte): Encrypts data with public key using OAEP padding (SHA-256)
  • DecryptOAEP(cipherText, privateKey []byte): Decrypts data with private key using OAEP padding (SHA-256)
  • EncryptOAEPBase64(plainText []byte, publicKeyBase64 string): Encrypts data with OAEP and returns base64-encoded result
  • DecryptOAEPBase64(cipherTextBase64, privateKeyBase64 string): Decrypts base64-encoded OAEP data
  • EncryptOAEPWithHash(plainText, publicKey, label []byte, hash hash.Hash): Encrypts with custom hash function
  • DecryptOAEPWithHash(cipherText, privateKey, label []byte, hash hash.Hash): Decrypts with custom hash function
General Encryption/Decryption (Legacy - PKCS#1 v1.5)
  • Encrypt(plainText, publicKey []byte): Encrypts data with public key (auto-detect format)
  • Decrypt(cipherText, privateKey []byte): Decrypts data with private key (auto-detect format)
  • EncryptBase64(plainText []byte, publicKeyBase64 string): Encrypts data with base64-encoded public key and returns base64-encoded result
  • DecryptBase64(cipherTextBase64, privateKeyBase64 string): Decrypts base64-encoded data with base64-encoded private key
PKCS#1 Specific Functions (Legacy)
  • EncryptPKCS1(plainText, publicKey []byte): Encrypts data with PKCS#1 format public key
  • DecryptPKCS1(cipherText, privateKey []byte): Decrypts data with PKCS#1 format private key
  • EncryptPKCS1Base64(plainText []byte, publicKeyBase64 string): Encrypts data with PKCS#1 public key and returns base64-encoded result
  • DecryptPKCS1Base64(cipherTextBase64, privateKeyBase64 string): Decrypts base64-encoded data with PKCS#1 private key
PKIX Specific Functions (Legacy)

PKIX (X.509) is the standard format for public keys, used with PKCS#8 private keys.

  • EncryptPKIX(plainText, publicKey []byte): Encrypts data with PKIX format public key
  • EncryptPKIXBase64(plainText []byte, publicKeyBase64 string): Encrypts data with PKIX public key and returns base64-encoded result
  • DecryptPKCS8(cipherText, privateKey []byte): Decrypts data with PKCS#8 format private key
  • DecryptPKCS8Base64(cipherTextBase64, privateKeyBase64 string): Decrypts base64-encoded data with PKCS#8 private key
Deprecated Functions

The following functions are deprecated and will be removed in future versions:

  • EncryptPKCS8(plainText, publicKey []byte): Use EncryptPKIX instead
  • EncryptPKCS8Base64(plainText []byte, publicKeyBase64 string): Use EncryptPKIXBase64 instead
Utility Functions
  • GetPrivateKeyType(privateKey []byte): Detects the type of private key (PKCS#1 or PKCS#8)
  • GetPrivateKeyTypeBase64(privateKeyBase64 string): Detects the type of base64 encoded private key
  • ExtractPKCS1PublicKey(privateKey []byte): Extracts PKCS#1 public key from PKCS#1 private key

Key Formats

The package supports two popular RSA key formats:

  1. PKCS#1: Traditional RSA key format

    • Private key PEM header: -----BEGIN RSA PRIVATE KEY-----
    • Public key PEM header: -----BEGIN RSA PUBLIC KEY-----
  2. PKCS#8/PKIX: More modern and flexible key format

    • Private key PEM header: -----BEGIN PRIVATE KEY-----
    • Public key PEM header: -----BEGIN PUBLIC KEY-----

Both formats are supported for encryption and decryption operations, with auto-detection capabilities for general functions.

Technical Background: PKCS#8 vs PKIX

PKCS#8 is a standard for private keys only, not public keys. Public keys use the PKIX (X.509 SubjectPublicKeyInfo) format.

Format Private Key PEM Header Public Key PEM Header
PKCS#1 RSA PRIVATE KEY RSA PUBLIC KEY
PKCS#8/PKIX PRIVATE KEY PUBLIC KEY

When we refer to a "PKCS#8 key pair", it actually means:

  • Private key: PKCS#8 format (RFC 5208)
  • Public key: PKIX/SubjectPublicKeyInfo format (RFC 5280, X.509)

This is why the Go standard library provides x509.MarshalPKCS8PrivateKey for private keys but x509.MarshalPKIXPublicKey for public keys — there is no MarshalPKCS8PublicKey function.

The deprecated EncryptPKCS8 function was a misnomer because encryption uses public keys, and public keys are in PKIX format, not PKCS#8. The correct function name is EncryptPKIX.

Plaintext Size Limit

RSA encryption has a size limit based on key size and padding scheme.

PKCS#1 v1.5 Padding (Legacy)
  • Max plaintext size = key_size_in_bytes - 11
  • For a 2048-bit key: max 245 bytes
  • For a 4096-bit key: max 501 bytes
  • Max plaintext size = key_size_in_bytes - 2 × hash_size - 2
  • For a 2048-bit key with SHA-256: max 190 bytes
  • For a 4096-bit key with SHA-256: max 446 bytes

If you need to encrypt larger data, consider using hybrid encryption (RSA + AES).

Error Handling

All functions return descriptive errors that can be handled using the GoFrame error package (gerror). Errors typically include:

  • Invalid key format
  • Failed key parsing
  • Plaintext too long
  • Encryption/decryption failures

Always check for errors in production code to ensure robust handling of edge cases.

Testing

Run the package tests with:

go test -v

Documentation

Overview

Package grsa provides useful API for RSA encryption/decryption algorithms.

This package includes functionality for: - Generating RSA key pairs in PKCS#1 and PKCS#8 formats - Encrypting and decrypting data with various key formats - Handling Base64 encoded keys - Detecting private key types

Security Considerations

This package provides two padding schemes for RSA encryption:

1. PKCS#1 v1.5 (legacy): Used by Encrypt*, DecryptPKCS1*, DecryptPKCS8* functions. This padding scheme is considered less secure and vulnerable to padding oracle attacks. It is provided for backward compatibility with existing systems.

2. OAEP (recommended): Used by EncryptOAEP*, DecryptOAEP* functions. OAEP (Optimal Asymmetric Encryption Padding) is the recommended padding scheme for new applications as it provides better security guarantees.

For new implementations, prefer using OAEP functions (EncryptOAEP, DecryptOAEP, etc.).

Index

Constants

View Source
const (
	// DefaultRSAKeyBits is the default bit size for RSA key generation
	DefaultRSAKeyBits = 2048

	// KeyTypePKCS1 represents PKCS#1 format private key
	KeyTypePKCS1 = "PKCS#1"
	// KeyTypePKCS8 represents PKCS#8 format private key
	KeyTypePKCS8 = "PKCS#8"
)

Variables

This section is empty.

Functions

func Decrypt

func Decrypt(cipherText, privateKey []byte) ([]byte, error)

Decrypt decrypts data with private key using PKCS#1 v1.5 padding (auto-detect format). The privateKey can be either PKCS#1 or PKCS#8 format.

Security Warning: PKCS#1 v1.5 padding is vulnerable to padding oracle attacks. For new applications, consider using DecryptOAEP instead.

func DecryptBase64

func DecryptBase64(cipherTextBase64, privateKeyBase64 string) ([]byte, error)

DecryptBase64 decrypts base64-encoded data with base64-encoded private key (auto-detect format).

func DecryptOAEP

func DecryptOAEP(cipherText, privateKey []byte) ([]byte, error)

DecryptOAEP decrypts data with private key using OAEP padding (auto-detect format). The privateKey can be either PKCS#1 or PKCS#8 format. Uses SHA-256 as the hash function by default.

func DecryptOAEPBase64

func DecryptOAEPBase64(cipherTextBase64, privateKeyBase64 string) ([]byte, error)

DecryptOAEPBase64 decrypts base64-encoded data with private key using OAEP padding.

func DecryptOAEPWithHash

func DecryptOAEPWithHash(cipherText, privateKey, label []byte, hash hash.Hash) ([]byte, error)

DecryptOAEPWithHash decrypts data with private key using OAEP padding with custom hash. The privateKey can be either PKCS#1 or PKCS#8 format. The label parameter must match the label used during encryption (nil if not used). The hash parameter must match the hash function used during encryption.

func DecryptPKCS1

func DecryptPKCS1(cipherText, privateKey []byte) ([]byte, error)

DecryptPKCS1 decrypts data with private key by PKCS#1 format.

func DecryptPKCS1Base64

func DecryptPKCS1Base64(cipherTextBase64, privateKeyBase64 string) ([]byte, error)

DecryptPKCS1Base64 decrypts base64-encoded data with PKCS#1 private key.

func DecryptPKCS8

func DecryptPKCS8(cipherText, privateKey []byte) ([]byte, error)

DecryptPKCS8 decrypts data with private key by PKCS#8 format.

func DecryptPKCS8Base64

func DecryptPKCS8Base64(cipherTextBase64, privateKeyBase64 string) ([]byte, error)

DecryptPKCS8Base64 decrypts data with private key by PKCS#8 format and decode base64 input.

func Encrypt

func Encrypt(plainText, publicKey []byte) ([]byte, error)

Encrypt encrypts data with public key using PKCS#1 v1.5 padding (auto-detect format). The publicKey can be either PKCS#1 or PKCS#8 (PKIX) format.

Note: RSA encryption has a size limit based on key size. For PKCS#1 v1.5 padding, max plaintext size = key_size_in_bytes - 11. For example, a 2048-bit key can encrypt at most 245 bytes.

Security Warning: PKCS#1 v1.5 padding is vulnerable to padding oracle attacks. For new applications, consider using EncryptOAEP instead.

func EncryptBase64

func EncryptBase64(plainText []byte, publicKeyBase64 string) (string, error)

EncryptBase64 encrypts data with base64-encoded public key (auto-detect format) and returns base64-encoded result.

func EncryptOAEP

func EncryptOAEP(plainText, publicKey []byte) ([]byte, error)

EncryptOAEP encrypts data with public key using OAEP padding (auto-detect format). The publicKey can be either PKCS#1 or PKCS#8 (PKIX) format. Uses SHA-256 as the hash function by default.

OAEP (Optimal Asymmetric Encryption Padding) is more secure than PKCS#1 v1.5 and is recommended for new applications.

Note: For OAEP with SHA-256, max plaintext size = key_size_in_bytes - 2*32 - 2. For a 2048-bit key, this is 190 bytes.

func EncryptOAEPBase64

func EncryptOAEPBase64(plainText []byte, publicKeyBase64 string) (string, error)

EncryptOAEPBase64 encrypts data with public key using OAEP padding and returns base64-encoded result.

func EncryptOAEPWithHash

func EncryptOAEPWithHash(plainText, publicKey, label []byte, hash hash.Hash) ([]byte, error)

EncryptOAEPWithHash encrypts data with public key using OAEP padding with custom hash. The publicKey can be either PKCS#1 or PKCS#8 (PKIX) format. The label parameter can be nil for most use cases. The hash parameter specifies the hash function to use (e.g., sha256.New()).

func EncryptPKCS1

func EncryptPKCS1(plainText, publicKey []byte) ([]byte, error)

EncryptPKCS1 encrypts data with public key in PKCS#1 format.

Note: RSA encryption has a size limit based on key size. For PKCS#1 v1.5 padding, max plaintext size = key_size_in_bytes - 11.

func EncryptPKCS1Base64

func EncryptPKCS1Base64(plainText []byte, publicKeyBase64 string) (string, error)

EncryptPKCS1Base64 encrypts data with PKCS#1 public key and returns base64-encoded result.

func EncryptPKCS8 deprecated

func EncryptPKCS8(plainText, publicKey []byte) ([]byte, error)

EncryptPKCS8 is an alias for EncryptPKIX for backward compatibility.

Deprecated: Use EncryptPKIX instead. Public keys use PKIX format, not PKCS#8.

func EncryptPKCS8Base64 deprecated

func EncryptPKCS8Base64(plainText []byte, publicKeyBase64 string) (string, error)

EncryptPKCS8Base64 is an alias for EncryptPKIXBase64 for backward compatibility.

Deprecated: Use EncryptPKIXBase64 instead.

func EncryptPKIX

func EncryptPKIX(plainText, publicKey []byte) ([]byte, error)

EncryptPKIX encrypts data with public key in PKIX (X.509) format. PKIX is the standard format for public keys, often referred to as "PKCS#8 public key".

Note: RSA encryption has a size limit based on key size. For PKCS#1 v1.5 padding, max plaintext size = key_size_in_bytes - 11.

func EncryptPKIXBase64

func EncryptPKIXBase64(plainText []byte, publicKeyBase64 string) (string, error)

EncryptPKIXBase64 encrypts data with PKIX public key and returns base64-encoded result.

func ExtractPKCS1PublicKey

func ExtractPKCS1PublicKey(privateKey []byte) ([]byte, error)

ExtractPKCS1PublicKey extracts PKCS#1 public key from private key.

func GenerateDefaultKeyPair

func GenerateDefaultKeyPair() (privateKey, publicKey []byte, err error)

GenerateDefaultKeyPair generates a new RSA key pair with default bits (2048).

func GenerateKeyPair

func GenerateKeyPair(bits int) (privateKey, publicKey []byte, err error)

GenerateKeyPair generates a new RSA key pair with the given bits.

func GenerateKeyPairPKCS8

func GenerateKeyPairPKCS8(bits int) (privateKey, publicKey []byte, err error)

GenerateKeyPairPKCS8 generates a new RSA key pair with the given bits in PKCS#8 format.

func GetPrivateKeyType

func GetPrivateKeyType(privateKey []byte) (string, error)

GetPrivateKeyType detects the type of private key (PKCS#1 or PKCS#8). It attempts to parse the key in both formats to determine the actual type.

func GetPrivateKeyTypeBase64

func GetPrivateKeyTypeBase64(privateKeyBase64 string) (string, error)

GetPrivateKeyTypeBase64 detects the type of base64 encoded private key (PKCS#1 or PKCS#8).

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL