MDGSF Software Engineer

[GO] 使用rsa

2017-10-25
GO

生成公钥私钥

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "os"
)

func main() {
    genRsaKey(1024)
}

func genRsaKey(bits int) error {
    privateKey, err := rsa.GenerateKey(rand.Reader, bits)
    if err != nil {
        return err
    }

    derStream := x509.MarshalPKCS1PrivateKey(privateKey)
    block := &pem.Block{
        Type:  "RSA PRIVATE KEY",
        Bytes: derStream,
    }

    file, err := os.Create("private.pem")
    if err != nil {
        return err
    }

    err = pem.Encode(file, block)
    if err != nil {
        return err
    }

    publicKey := &privateKey.PublicKey
    derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
    if err != nil {
        return err
    }

    block = &pem.Block{
        Type:  "PUBLIC KEY",
        Bytes: derPkix,
    }

    file, err = os.Create("public.pem")
    if err != nil {
        return err
    }

    err = pem.Encode(file, block)
    if err != nil {
        return err
    }

    return nil
}

使用rsa

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "errors"
    "fmt"
    "io/ioutil"
)

var (
    publicKey  []byte
    privateKey []byte
)

func init() {
    pub, _ := ioutil.ReadFile("../genRSAKey/public.pem")
    publicKey = []byte(pub)

    pri, _ := ioutil.ReadFile("../genRSAKey/private.pem")
    privateKey = []byte(pri)
}

func RsaEncrypt(origData []byte) ([]byte, error) {
    block, _ := pem.Decode(publicKey)
    if block == nil {
        return nil, errors.New("public key error")
    }

    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        return nil, err
    }

    pub := pubInterface.(*rsa.PublicKey)
    return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}

func RsaDecrypt(ciphertext []byte) ([]byte, error) {
    block, _ := pem.Decode(privateKey)
    if block == nil {
        return nil, errors.New("Private key error!")
    }

    priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        return nil, err
    }

    return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
}

func main() {
    data, err := RsaEncrypt([]byte("1342042894@qq.com"))
    if err != nil {
        panic(err)
    }

    fmt.Println(string(data))

    origData, err := RsaDecrypt(data)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(origData))
}

weixingongzhonghao

上一篇 [GO] 使用redis

Comments

Content