使用golang获取RSA密钥,方法同openssl genrsa
Use golang to get RSA key the same way openssl genrsa
openssl genrsa -out .rsa
openssl rsa -in .rsa -pubout > .rsa.pub
我正在向这个小脚本传递两个参数,我如何使用 golang 执行此操作?我没有得到正确的解析格式。
要生成 RSA 密钥对并将私钥和 public 密钥写入单独的文件,您需要执行以下操作:
- 使用 rsa.GenerateKey
生成 RSA 密钥对
- 使用 rsa.PrivateKey.Public
获取 public 关键组件
- 分别使用x509.MarshalPKCS1PrivateKey and x509.MarshalPKCS1PublicKey将密钥转换为 PKCS#1 ASN.1 DER 形式
- 使用 pem.EncodeToMemory
编码成 PEM 块
- 写入文件
完整的操作集如下所示,其中 filename
和 bitSize
分别是您的 </code> 和 <code>
参数。
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)
}
}
这将生成以下两个文件:
key.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。
openssl genrsa -out .rsa
openssl rsa -in .rsa -pubout > .rsa.pub
我正在向这个小脚本传递两个参数,我如何使用 golang 执行此操作?我没有得到正确的解析格式。
要生成 RSA 密钥对并将私钥和 public 密钥写入单独的文件,您需要执行以下操作:
- 使用 rsa.GenerateKey 生成 RSA 密钥对
- 使用 rsa.PrivateKey.Public 获取 public 关键组件
- 分别使用x509.MarshalPKCS1PrivateKey and x509.MarshalPKCS1PublicKey将密钥转换为 PKCS#1 ASN.1 DER 形式
- 使用 pem.EncodeToMemory 编码成 PEM 块
- 写入文件
完整的操作集如下所示,其中 filename
和 bitSize
分别是您的 </code> 和 <code>
参数。
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)
}
}
这将生成以下两个文件:
key.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。