为了账号安全,请及时绑定邮箱和手机立即绑定

使用 golang 以与 openssl genrsa 相同的方式获取 RSA 密钥

使用 golang 以与 openssl genrsa 相同的方式获取 RSA 密钥

Go
30秒到达战场 2022-07-04 16:30:40
openssl genrsa -out $1.rsa $2 openssl rsa -in $1.rsa -pubout > $1.rsa.pub我将两个参数传递给这个小脚本,我怎样才能使用 golang 来做到这一点?我没有得到正确的解析格式。
查看完整描述

1 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

要生成 RSA 密钥对并将私钥和公钥写入单独的文件,您需要执行以下操作:

  1. 使用rsa.GenerateKey生成 RSA 密钥对

  2. 使用rsa.PrivateKey.Public获取公钥组件

  3. 分别使用x509.MarshalPKCS1PrivateKeyx509.MarshalPKCS1PublicKey将密钥转换为 PKCS#1 ASN.1 DER 形式

  4. 使用pem.EncodeToMemory编码成 PEM 块

  5. 写出文件

完整的操作集如下所示,其中filenamebitSize 分别是您的$1$2参数。

package main


import (

    "crypto/rand"

    "crypto/rsa"

    "crypto/x509"

    "encoding/pem"

    "io/ioutil"

)


func main() {

    filename := "key"

    bitSize := 4096


    // Generate RSA key.

    key, err := rsa.GenerateKey(rand.Reader, bitSize)

    if err != nil {

        panic(err)

    }


    // Extract public component.

    pub := key.Public()


    // Encode private key to PKCS#1 ASN.1 PEM.

    keyPEM := pem.EncodeToMemory(

        &pem.Block{

            Type:  "RSA PRIVATE KEY",

            Bytes: x509.MarshalPKCS1PrivateKey(key),

        },

    )


    // Encode public key to PKCS#1 ASN.1 PEM.

    pubPEM := pem.EncodeToMemory(

        &pem.Block{

            Type:  "RSA PUBLIC KEY",

            Bytes: x509.MarshalPKCS1PublicKey(pub.(*rsa.PublicKey)),

        },

    )


    // Write private key to file.

    if err := ioutil.WriteFile(filename+".rsa", keyPEM, 0700); err != nil {

        panic(err)

    }


    // Write public key to file.

    if err := ioutil.WriteFile(filename+".rsa.pub", pubPEM, 0755); err != nil {

        panic(err)

    }

}

这将生成以下两个文件:


密钥.rsa:


-----BEGIN RSA PRIVATE KEY-----

MIIJJwIBAAKCAgEAsmJ+97V6zCOQdXDd0pivvgoXynKAHaImVdafXDwN+Eb2xKTg

zjhthm144DZzO9/SllCdyLwhXKBQkgim2S5A4iV5w6/yvChqL72+BrItP0+1tAgY

vt/CcShDtMdSikW13BN3+SGZSP9yrEsdU2KMK6HSGcSxMpki/XW2BbGkdr3gMtpM

...

S8tZZ/gby/k9nG7Pbw55QM8/Jkyvy/lPP94HrE+MuIiTEd9BG4c7CRNIuE6QoCjp

1+NIbqEPJTJMfH57cx8R/stLh2nBGcngjmWz+VWhufzhsOr7Wl8Xd6hf13hm4hWG

y+2pknoTGvw05tiU/eLAbNimtWMOtEdfePzT5NTjV++9kJSr470eyDs2bg==

-----END RSA PRIVATE KEY-----

key.rsa.pub:


-----BEGIN RSA PUBLIC KEY-----

MIICCgKCAgEAsmJ+97V6zCOQdXDd0pivvgoXynKAHaImVdafXDwN+Eb2xKTgzjht

hm144DZzO9/SllCdyLwhXKBQkgim2S5A4iV5w6/yvChqL72+BrItP0+1tAgYvt/C

...

8Xil1cP/5LxIMa1WGHEG1jzrWJkyaVXHS0JOi3FcI4KPQttut2rWpSi3MtAlmuTx

k/AfM3oNnAUlcjYNa+onSs7GgLhd1A5/EiLGMR304uWKno8HrYQfESsCAwEAAQ==

-----END RSA PUBLIC KEY-----

我建议您熟悉链接的功能,它们的文档非常有用。还有其他可用的格式选项(例如:PKCS#8 和 PKIX)以及用于私钥的加密 PEM。


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信