golang中encoding/pem包

栏目: Go · 发布时间: 5年前

内容简介:1、golang中pem包是什么?2、golang中的pem包为我们开发者提供了哪些功能?3、我们可以用pem包做什么?以及怎么使用代码实现?

1、golang中pem包是什么?

2、golang中的pem包为我们开发者提供了哪些功能?

3、我们可以用pem包做什么?以及怎么使用代码实现?

一、golang中pem包是什么?

官方标准库给出的解释:pem包实现了PEM数据编码(源自保密增强邮件协议)。目前PEM编码主要用于TLS密钥和证书。参见 RFC 1421

也就是这个包实现了对PEM解码,以及进行PEM编码

我们不必关心PEM格式的数据长怎么样,只要关注怎么将其他格式数据转换成PEM格式数据,以及将PEM格式数据转换成其他格式数据。如果需要了解PEM是什么,可以阅读RFC 1421文档。

二、golang中的pem包为我们开发者提供了哪些功能?

根据前面分析出来的内容,可以知道分为两个内容,分别是对数据进行PEM编码和解码。也就是说,pem包就是围绕这两个功能进行操作的。

三、我们可以用pem包怎么进行编码以及解码?以及怎么使用代码实现?

1)编码操作

这边给出一个产生RSA公私密钥文件生成的代码实现。

说明,这篇博客的源码我是参考自 这边,点击跳往 ,这个博客的代码,编码操作结合生成rsa公钥和私钥的场景案例。

package main

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

func main() {
    var bits int
    flag.IntVar(&bits, "b", 1024, "密钥长度,默认是1024")
    flag.Parse()

    if GenRsaKey(bits) != nil {
        log.Fatalln("密钥文件生成失败!")
    }
    log.Println("密钥文件生成成功!")
}

func GenRsaKey(bits int) error {
    // 生成私钥文件
    privateKey, err := rsa.GenerateKey(rand.Reader, bits)
    if err != nil {
        return nil
    }
    derStream := x509.MarshalPKCS1PrivateKey(privateKey)
    /* 核心代码开始 */
    block := &pem.Block{
        Type:"PRIVATE KEY",
        Bytes:derStream,
    }
    fi, err := os.Create("private.pem")
    if err != nil {
        return err
    }
    err = pem.Encode(fi, 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,
    }
    fi, err = os.Create("public.pem")
    if err != nil {
        return err
    }
    err = pem.Encode(fi, block)
    /* 核心代码结束 */
    return err
}

2)解码操作

package main

import (
    "io/ioutil"
    "log"
    "github.com/syndtr/goleveldb/leveldb/errors"
    "encoding/pem"
    "crypto/x509"
    "crypto/rsa"
    "fmt"
)

// 全局变量
var privateKey, publicKey []byte

func init() {
    var err error
    publicKey, err = ioutil.ReadFile("public.pem")
    if err != nil {
        log.Fatalln(err)
    }
    privateKey, err = ioutil.ReadFile("private.pem")
    if err != nil {
        log.Fatalln(err)
    }
}
/**
 * 功能:获取RSA公钥长度
 * 参数:public
 * 返回:成功则返回 RSA 公钥长度,失败返回 error 错误信息
 */
func GetPubKeyLen(pubKey []byte) (int, error) {
    if pubKey == nil {
        return 0, errors.New("input arguments error")
    }
    block, _ := pem.Decode(publicKey)
    if block == nil {
        return 0, errors.New("public rsaKey error")
    }
    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        return 0, err
    }
    pub := pubInterface.(*rsa.PublicKey)
    return pub.N.BitLen(), nil
}
/*
    获取RSA私钥长度
    PriKey
    成功返回 RSA 私钥长度,失败返回error
 */
func GetPriKeyLen(priKey []byte) (int, error) {
    if priKey == nil {
        return 0, errors.New("input arguments error")
    }
    block, _ := pem.Decode(priKey)
    if block == nil {
        return 0, errors.New("private rsaKey error")
    }
    priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        return 0, err
    }
    return priv.N.BitLen(), nil
}

func main() {
    // 获取rsa 公钥长度
    pubKeyLen, _ := GetPubKeyLen(publicKey)
    fmt.Println(pubKeyLen)

    // 获取rsa 私钥长度
    privateLen, _ := GetPriKeyLen(privateKey)
    fmt.Println(privateLen)
}

资源链接: https://blog.csdn.net/qq_21794823/article/details/79817733


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Test Driven Development

Test Driven Development

Kent Beck / Addison-Wesley Professional / 2002-11-18 / USD 49.99

Quite simply, test-driven development is meant to eliminate fear in application development. While some fear is healthy (often viewed as a conscience that tells programmers to "be careful!"), the auth......一起来看看 《Test Driven Development》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具