rsacrypto

package module
v0.0.0-...-87b4d34 Latest Latest
Warning

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

Go to latest
Published: Mar 15, 2020 License: MIT Imports: 10 Imported by: 0

README

rsacrypto-go

The rsacrypto is a RSA encryption and decryption tool based on official golang library.

Key features:

  • Easy to use.
  • Support encryption and decryption of large data.

Encryption and Decryption of Large Data

About data size limit of RSA algorithm, see https://en.wikipedia.org/wiki/RSA_(cryptosystem).

This library support RSA encryption and decryption of large by dividing data into chunks.

Encrypt with RSA Public Key

  1. Encrypt
package example

import (
    "crypto"
    "encoding/base64"
    "rsacrypto"
)

const (
    publicKeyBase64 = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwe7ST4M16O/B8tBCZ0bwrrcZP
                       H+5UCaEbEnOnRjQ+TfnfdEN3IhpA1+bgjDF/2sa83ONnzWaVOl+urB1gdCdUA+FJ
                       22ZgnvynEuafxh9R5dk7X9GRkin6xRN7ABrY0rubMFpNChc0vgm0+r8HHXrTo7pM
                       0QdIdM4TfhczB4SaBQIDAQAB`

    plain = `This is a test plain message.`
)

func ExampleEncrypt() ([]byte, error) {
    pubKey, err := NewRSAPublicKey().SetEncodedKey(publicKeyBase64, base64.StdEncoding)
    if err != nil {
        return nil, err
    }
    return pubKey.Encrypt([]byte(plain))
}
  1. Encrypt and Encode
package example

import (
    "crypto"
    "encoding/base64"
    "rsacrypto"
)

const (
    publicKeyBase64 = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwe7ST4M16O/B8tBCZ0bwrrcZP
                       H+5UCaEbEnOnRjQ+TfnfdEN3IhpA1+bgjDF/2sa83ONnzWaVOl+urB1gdCdUA+FJ
                       22ZgnvynEuafxh9R5dk7X9GRkin6xRN7ABrY0rubMFpNChc0vgm0+r8HHXrTo7pM
                       0QdIdM4TfhczB4SaBQIDAQAB`

    plain = `This is a test plain message.`
)

func ExampleEncryptAndEncode() (string, error) {
    pubKey, err := NewRSAPublicKey().SetEncodedKey(publicKeyBase64, base64.StdEncoding)
    if err != nil {
        return "", err
    }
    return pubKey.EncryptAndEncode([]byte(plain), base64.StdEncoding)
}

Decrypt with a RSA Private Key

  1. Decrypt
package example

import (
    "crypto"
    "encoding/base64"
    "rsacrypto"
)

const (
    privateKeyBase64 = `MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJnsAKOsL0LHnOKZ
                        Dyro2I7dfy2xluq2kXAm01yP2NuVC5EubJjHXJYGL03kmkVfXXTpR3JwUYJkjoqO
                        ITLwAyD3/n+Y9Jio/ELAaxBC/7uMgnwATdYQqvlEGAiN2vwA0T9HhKUCiVkodg/b
                        hNyebTgRxmMoFtUkbM09dwCwMOnLAgMBAAECgYBHFMbCzwxQQZCA0IBBp6ACceV+
                        e4mfQMpvSW7ISyGxXeYmmJLMBx0JpzeHOC/KI50sFWLKRXZOyhNNhw9rz40RoDUD
                        lL67Hjce9mqIn266E375xOTv6eQ8V7FLClFBzXSTg+oxHerpZDEF5UH9MVaKiHda
                        LxWkdD6RMPknDizt4QJBAMpOcRY2xYVkX2DST5V7o6pWz4RxM0Vkj+5eMI0f4svR
                        AlylRCqlZLT5DqLpuxEoYCJj7Xr53GXl3DzWGm3Ns7sCQQDCxhwujwhpbx/mE3Yh
                        3qfHkVxqagpLjHa3jYxaL8i3n8ayGc9lgR0EjNAs+fLF3iYGZJxyYu/QGpu1rH73
                        6NkxAkAYo8EmQXmBK55qPnMu86YVYwlXSipCc2MMVzB2n8GRrV0qR36r6wT+/a6I
                        rQr5pf8/cQhFiBUN3Bcc2b7STNFtAkA119hQkp/LrbmOu9CLWmbdR3TZwgioi+MB
                        qPKkt9Lv2A5wi6wGrmOcL2UZGdugEWJHoCaThIAw8jobRd0voUHxAkEAg8F19wnC
                        Nbmu9mtwXBhXFSfnwucXO3kklMlb1ZRbJnqoltWSB60njjF9Iw+aSekBkqCC3t3V
                        O8wjYqIOxrtt9g==`

    cipher = `JNSakhRSuKtktiZejyYXqOaULZI6PH9HdrLgfPC0m+H8ebWQnLCB3o85DP1jHb4UTKTiL/8Ml1hlOvUuZuvAOFYymNfraVfmcGCB9zzs2A24tK3qQNxtpWMWPhM4ZemZvoYFMkLiy22POFRRaCDf65AUAmgsQWuEH9qccqurRXA=`
)

func ExampleDecrypt() ([]byte, error) {
    cipherBytes, err := base64.StdEncoding.DecodeString(cipher)
    if err != nil {
        return nil, err
    }
    privKey, err := NewRSAPrivateKey().SetEncodedKey(privateKeyBase64, base64.StdEncoding)
    if err != nil {
        return nil, err
    }
    // plain is the decrypted byte data.
    return privKey.Decrypt(cipherBytes)
}
  1. Decode and Decrypt
package example

import (
    "crypto"
    "encoding/base64"
    "rsacrypto"
)

const (
    privateKeyBase64 = `MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJnsAKOsL0LHnOKZ
                        Dyro2I7dfy2xluq2kXAm01yP2NuVC5EubJjHXJYGL03kmkVfXXTpR3JwUYJkjoqO
                        ITLwAyD3/n+Y9Jio/ELAaxBC/7uMgnwATdYQqvlEGAiN2vwA0T9HhKUCiVkodg/b
                        hNyebTgRxmMoFtUkbM09dwCwMOnLAgMBAAECgYBHFMbCzwxQQZCA0IBBp6ACceV+
                        e4mfQMpvSW7ISyGxXeYmmJLMBx0JpzeHOC/KI50sFWLKRXZOyhNNhw9rz40RoDUD
                        lL67Hjce9mqIn266E375xOTv6eQ8V7FLClFBzXSTg+oxHerpZDEF5UH9MVaKiHda
                        LxWkdD6RMPknDizt4QJBAMpOcRY2xYVkX2DST5V7o6pWz4RxM0Vkj+5eMI0f4svR
                        AlylRCqlZLT5DqLpuxEoYCJj7Xr53GXl3DzWGm3Ns7sCQQDCxhwujwhpbx/mE3Yh
                        3qfHkVxqagpLjHa3jYxaL8i3n8ayGc9lgR0EjNAs+fLF3iYGZJxyYu/QGpu1rH73
                        6NkxAkAYo8EmQXmBK55qPnMu86YVYwlXSipCc2MMVzB2n8GRrV0qR36r6wT+/a6I
                        rQr5pf8/cQhFiBUN3Bcc2b7STNFtAkA119hQkp/LrbmOu9CLWmbdR3TZwgioi+MB
                        qPKkt9Lv2A5wi6wGrmOcL2UZGdugEWJHoCaThIAw8jobRd0voUHxAkEAg8F19wnC
                        Nbmu9mtwXBhXFSfnwucXO3kklMlb1ZRbJnqoltWSB60njjF9Iw+aSekBkqCC3t3V
                        O8wjYqIOxrtt9g==`

    cipher = `JNSakhRSuKtktiZejyYXqOaULZI6PH9HdrLgfPC0m+H8ebWQnLCB3o85DP1jHb4UTKTiL/8Ml1hlOvUuZuvAOFYymNfraVfmcGCB9zzs2A24tK3qQNxtpWMWPhM4ZemZvoYFMkLiy22POFRRaCDf65AUAmgsQWuEH9qccqurRXA=`
)

func ExampleDecodeAndDecrypt() ([]byte, error) {
    privKey, err := NewRSAPrivateKey().SetEncodedKey(privateKeyBase64, base64.StdEncoding)
    if err != nil {
        return nil, err
    }
    return privKey.DecodeAndDecrypt(cipher, base64.StdEncoding)
}

Sign with RSA Private Key

  1. Sign
package example

import (
    "crypto"
    "encoding/base64"
    "rsacrypto"
)

const (
    privateKeyBase64 = `MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJnsAKOsL0LHnOKZ
                        Dyro2I7dfy2xluq2kXAm01yP2NuVC5EubJjHXJYGL03kmkVfXXTpR3JwUYJkjoqO
                        ITLwAyD3/n+Y9Jio/ELAaxBC/7uMgnwATdYQqvlEGAiN2vwA0T9HhKUCiVkodg/b
                        hNyebTgRxmMoFtUkbM09dwCwMOnLAgMBAAECgYBHFMbCzwxQQZCA0IBBp6ACceV+
                        e4mfQMpvSW7ISyGxXeYmmJLMBx0JpzeHOC/KI50sFWLKRXZOyhNNhw9rz40RoDUD
                        lL67Hjce9mqIn266E375xOTv6eQ8V7FLClFBzXSTg+oxHerpZDEF5UH9MVaKiHda
                        LxWkdD6RMPknDizt4QJBAMpOcRY2xYVkX2DST5V7o6pWz4RxM0Vkj+5eMI0f4svR
                        AlylRCqlZLT5DqLpuxEoYCJj7Xr53GXl3DzWGm3Ns7sCQQDCxhwujwhpbx/mE3Yh
                        3qfHkVxqagpLjHa3jYxaL8i3n8ayGc9lgR0EjNAs+fLF3iYGZJxyYu/QGpu1rH73
                        6NkxAkAYo8EmQXmBK55qPnMu86YVYwlXSipCc2MMVzB2n8GRrV0qR36r6wT+/a6I
                        rQr5pf8/cQhFiBUN3Bcc2b7STNFtAkA119hQkp/LrbmOu9CLWmbdR3TZwgioi+MB
                        qPKkt9Lv2A5wi6wGrmOcL2UZGdugEWJHoCaThIAw8jobRd0voUHxAkEAg8F19wnC
                        Nbmu9mtwXBhXFSfnwucXO3kklMlb1ZRbJnqoltWSB60njjF9Iw+aSekBkqCC3t3V
                        O8wjYqIOxrtt9g==`

    data = `This is a test data.`
)

func ExampleSign() ([]byte, error) {
    privKey, err := NewRSAPrivateKey().SetEncodedKey(privateKeyBase64, base64.StdEncoding)
    if err != nil {
        return nil, err
    }
    // sign is a byte array.
    return privKey.SetSignerHash(crypto.SHA1).Sign([]byte(data))
}
  1. Sign and Encode
package example

import (
    "crypto"
    "encoding/base64"
    "rsacrypto"
)

const (
    privateKeyBase64 = `MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJnsAKOsL0LHnOKZ
                        Dyro2I7dfy2xluq2kXAm01yP2NuVC5EubJjHXJYGL03kmkVfXXTpR3JwUYJkjoqO
                        ITLwAyD3/n+Y9Jio/ELAaxBC/7uMgnwATdYQqvlEGAiN2vwA0T9HhKUCiVkodg/b
                        hNyebTgRxmMoFtUkbM09dwCwMOnLAgMBAAECgYBHFMbCzwxQQZCA0IBBp6ACceV+
                        e4mfQMpvSW7ISyGxXeYmmJLMBx0JpzeHOC/KI50sFWLKRXZOyhNNhw9rz40RoDUD
                        lL67Hjce9mqIn266E375xOTv6eQ8V7FLClFBzXSTg+oxHerpZDEF5UH9MVaKiHda
                        LxWkdD6RMPknDizt4QJBAMpOcRY2xYVkX2DST5V7o6pWz4RxM0Vkj+5eMI0f4svR
                        AlylRCqlZLT5DqLpuxEoYCJj7Xr53GXl3DzWGm3Ns7sCQQDCxhwujwhpbx/mE3Yh
                        3qfHkVxqagpLjHa3jYxaL8i3n8ayGc9lgR0EjNAs+fLF3iYGZJxyYu/QGpu1rH73
                        6NkxAkAYo8EmQXmBK55qPnMu86YVYwlXSipCc2MMVzB2n8GRrV0qR36r6wT+/a6I
                        rQr5pf8/cQhFiBUN3Bcc2b7STNFtAkA119hQkp/LrbmOu9CLWmbdR3TZwgioi+MB
                        qPKkt9Lv2A5wi6wGrmOcL2UZGdugEWJHoCaThIAw8jobRd0voUHxAkEAg8F19wnC
                        Nbmu9mtwXBhXFSfnwucXO3kklMlb1ZRbJnqoltWSB60njjF9Iw+aSekBkqCC3t3V
                        O8wjYqIOxrtt9g==`

    data = `This is a test data.`
)

func ExampleSignAndEncode() (string, error) {
    privKey, err := NewRSAPrivateKey().SetEncodedKey(privateKeyBase64, base64.StdEncoding)
    if err != nil {
        return "", err
    }
    // sign is encoded by HexEncoding.
    return privKey.SetSignerHash(crypto.SHA1).SignAndEncode([]byte(data), HexEncoding)
}

Verify Sign with RSA Public Key

  1. Verify Sign
package example

import (
    "crypto"
    "encoding/base64"
    "rsacrypto"
)

const (
    publicKeyBase64 = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxpR9dSyOKXqfnoGxHchJxfX/W
                       NYTBALm6trLLcqpdoTu73B9fvNVPkc45S/pc1yxzrFGSDwrNwqPl4J3HTPF2hPzY
                       PaYs9ZrYQppBZ7NVTRNBjV41zzZRZ1EmpSfVMLKkHKMvREpJIfp00ky1YHRm52Ee
                       V4jtLN1KSC8BhLRslQIDAQAB`

		data = `Hello world!世界你好!`

		sign = `FWYb8nidardAExJa8ynvSnHMprgubYy3q45C3qqGC0G4X1m+2Q6z6y91lIvpWOb8t/DWurrxwn9p3DppX+zig1iykCwyR0ucA2Dc3PD6+Rf7Gl0eAMWVDrBKHA/OfHT1IdtozpAqVO4luMJwXmAjVR1zcS9ENQUnySwxpVvwMQQ=`
)

func ExampleVerifySign() error {
    signBytes, err := base64.StdEncoding.DecodeString(sign)
    if err != nil {
        return err
    }
    pubKey, err := NewRSAPublicKey().SetEncodedKey(publicKeyBase64, base64.StdEncoding)
    if err != nil {
        return err
    }
    return pubKey.SetSignerHash(crypto.SHA256).Verify([]byte(data), signBytes)
}
  1. Decode and Verify Sign
package example

import (
    "crypto"
    "encoding/base64"
    "rsacrypto"
)

const (
    publicKeyBase64 = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxpR9dSyOKXqfnoGxHchJxfX/W
                       NYTBALm6trLLcqpdoTu73B9fvNVPkc45S/pc1yxzrFGSDwrNwqPl4J3HTPF2hPzY
                       PaYs9ZrYQppBZ7NVTRNBjV41zzZRZ1EmpSfVMLKkHKMvREpJIfp00ky1YHRm52Ee
                       V4jtLN1KSC8BhLRslQIDAQAB`

    data = `Hello world!世界你好!`

    sign = `FWYb8nidardAExJa8ynvSnHMprgubYy3q45C3qqGC0G4X1m+2Q6z6y91lIvpWOb8t/DWurrxwn9p3DppX+zig1iykCwyR0ucA2Dc3PD6+Rf7Gl0eAMWVDrBKHA/OfHT1IdtozpAqVO4luMJwXmAjVR1zcS9ENQUnySwxpVvwMQQ=`
)

func ExampleDecodeAndVerifySign() error {
    pubKey, err := NewRSAPublicKey().SetEncodedKey(publicKeyBase64, base64.StdEncoding)
    if err != nil {
        return err
    } 
    return pubKey.SetSignerHash(crypto.SHA256).DecodeAndVerify([]byte(data), sign, HexEncoding)
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var HexEncoding = hexEncoding{}

Functions

func ParseDERPrivateKey

func ParseDERPrivateKey(der []byte) (key *rsa.PrivateKey, err error)

Parse rsa private key from DER (binary) data.

PKCS8, PKCS1 formats would try one by one.
About DER, @see https://en.wikipedia.org/wiki/X.690#DER_encoding .

func ParseDERPublicKey

func ParseDERPublicKey(der []byte) (key *rsa.PublicKey, err error)

Parse rsa public key from DER (binary) data.

PKIX, PKCS1 formats would try one by one.
About DER, @see https://en.wikipedia.org/wiki/X.690#DER_encoding .

func ParseEncodedPrivateKey

func ParseEncodedPrivateKey(keyBase64 string, encoding Encoding) (key *rsa.PrivateKey, err error)

Parse rsa private key from a base64 string.

func ParseEncodedPublicKey

func ParseEncodedPublicKey(keyBase64 string, encoding Encoding) (key *rsa.PublicKey, err error)

Parse rsa public key from a base64 string.

Types

type DecrypterOpts

type DecrypterOpts interface{}

type DefaultSignerOpts

type DefaultSignerOpts struct {
	Hash crypto.Hash
}

func (*DefaultSignerOpts) HashFunc

func (opts *DefaultSignerOpts) HashFunc() crypto.Hash

type Encoding

type Encoding interface {
	EncodeToString(b []byte) string
	DecodeString(s string) ([]byte, error)
}

A common interface used to transform data between bytes and string. All base64 encodings implement this interface.

type EncrypterOpts

type EncrypterOpts interface{}

type MarshalFunc

type MarshalFunc func(v interface{}) ([]byte, error)

type RSADecrypter

type RSADecrypter struct {
	// contains filtered or unexported fields
}

func NewRSADecrypter

func NewRSADecrypter(privateKey *rsa.PrivateKey, opts DecrypterOpts) *RSADecrypter

func (*RSADecrypter) Decrypt

func (dec *RSADecrypter) Decrypt(cipher []byte) (plain []byte, err error)

type RSAEncrypter

type RSAEncrypter struct {
	// contains filtered or unexported fields
}

func NewRSAEncrypter

func NewRSAEncrypter(publicKey *rsa.PublicKey, opts EncrypterOpts) *RSAEncrypter

func (*RSAEncrypter) Encrypt

func (enc *RSAEncrypter) Encrypt(plain []byte) (cipher []byte, err error)

type RSAPrivateKey

type RSAPrivateKey struct {
	// contains filtered or unexported fields
}

A wrapper for decrypt and sign.

func NewRSAPrivateKey

func NewRSAPrivateKey() *RSAPrivateKey

func (*RSAPrivateKey) DecodeAndDecrypt

func (k *RSAPrivateKey) DecodeAndDecrypt(cipher string, encoding Encoding) (plain []byte, err error)

func (*RSAPrivateKey) DecodeAndDecryptToObject

func (k *RSAPrivateKey) DecodeAndDecryptToObject(cipher string, encoding Encoding, object interface{}) error

func (*RSAPrivateKey) Decrypt

func (k *RSAPrivateKey) Decrypt(cipher []byte) (plain []byte, err error)

func (*RSAPrivateKey) DecryptToObject

func (k *RSAPrivateKey) DecryptToObject(cipher []byte, object interface{}) error

func (*RSAPrivateKey) SetDecrypterOpts

func (k *RSAPrivateKey) SetDecrypterOpts(opts DecrypterOpts) *RSAPrivateKey

func (*RSAPrivateKey) SetEncodedKey

func (k *RSAPrivateKey) SetEncodedKey(encodedKey string, encoding Encoding) (*RSAPrivateKey, error)

func (*RSAPrivateKey) SetKey

func (k *RSAPrivateKey) SetKey(key *rsa.PrivateKey) *RSAPrivateKey

func (*RSAPrivateKey) SetSignerHash

func (k *RSAPrivateKey) SetSignerHash(hash crypto.Hash) *RSAPrivateKey

func (*RSAPrivateKey) SetSignerOpts

func (k *RSAPrivateKey) SetSignerOpts(opts crypto.SignerOpts) *RSAPrivateKey

func (*RSAPrivateKey) SetUnmarshalFunc

func (k *RSAPrivateKey) SetUnmarshalFunc(unmarshal UnmarshalFunc) *RSAPrivateKey

func (*RSAPrivateKey) Sign

func (k *RSAPrivateKey) Sign(data []byte) (sign []byte, err error)

func (*RSAPrivateKey) SignAndEncode

func (k *RSAPrivateKey) SignAndEncode(data []byte, encoding Encoding) (sign string, err error)

type RSAPublicKey

type RSAPublicKey struct {
	// contains filtered or unexported fields
}

A wrapper for encrypt and verify sign.

func NewRSAPublicKey

func NewRSAPublicKey() *RSAPublicKey

func (*RSAPublicKey) DecodeAndVerify

func (k *RSAPublicKey) DecodeAndVerify(data []byte, sign string, encoding Encoding) error

func (*RSAPublicKey) Encrypt

func (k *RSAPublicKey) Encrypt(plain []byte) (cipher []byte, err error)

func (*RSAPublicKey) EncryptAndEncode

func (k *RSAPublicKey) EncryptAndEncode(plain []byte, encoding Encoding) (cipher string, err error)

func (*RSAPublicKey) EncryptObject

func (k *RSAPublicKey) EncryptObject(object interface{}) (cipher []byte, err error)

Encrypt a object.

func (*RSAPublicKey) EncryptObjectAndEncode

func (k *RSAPublicKey) EncryptObjectAndEncode(object interface{}, encoding Encoding) (cipher string, err error)

func (*RSAPublicKey) SetEncodedKey

func (k *RSAPublicKey) SetEncodedKey(encodedKey string, encoding Encoding) (*RSAPublicKey, error)

func (*RSAPublicKey) SetEncrypterOpts

func (k *RSAPublicKey) SetEncrypterOpts(opts EncrypterOpts) *RSAPublicKey

func (*RSAPublicKey) SetKey

func (k *RSAPublicKey) SetKey(key *rsa.PublicKey) *RSAPublicKey

func (*RSAPublicKey) SetMarshalFunc

func (k *RSAPublicKey) SetMarshalFunc(marshal MarshalFunc) *RSAPublicKey

func (*RSAPublicKey) SetSignerHash

func (k *RSAPublicKey) SetSignerHash(hash crypto.Hash) *RSAPublicKey

func (*RSAPublicKey) SetSignerOpts

func (k *RSAPublicKey) SetSignerOpts(opts crypto.SignerOpts) *RSAPublicKey

func (*RSAPublicKey) Verify

func (k *RSAPublicKey) Verify(data []byte, sign []byte) error

type RSASigner

type RSASigner struct {
	// contains filtered or unexported fields
}

func NewRSASigner

func NewRSASigner(privateKey *rsa.PrivateKey, opts crypto.SignerOpts) *RSASigner

func (*RSASigner) Sign

func (sig *RSASigner) Sign(data []byte) (sign []byte, err error)

type RSAVerifier

type RSAVerifier struct {
	// contains filtered or unexported fields
}

func NewRSAVerifier

func NewRSAVerifier(publicKey *rsa.PublicKey, opts crypto.SignerOpts) *RSAVerifier

func (*RSAVerifier) Verify

func (ver *RSAVerifier) Verify(data []byte, sign []byte) (err error)

type UnmarshalFunc

type UnmarshalFunc func(data []byte, v interface{}) error

Jump to

Keyboard shortcuts

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