GO实现非对称加密--RSA生成公钥私钥
吃瓜围观小分队
发表于 2023-1-12 12:13:44
268
0
0
import (# W0 \7 q3 _1 B: _% [
"crypto/rand"- c/ s% R4 F6 [2 ]$ P7 D, H
"crypto/rsa"9 ?3 m) b/ K. S, u# r$ _9 w
"crypto/x509"
"encoding/pem"* _( ~: i: e4 m0 n6 K8 s1 a) W
"flag"0 o1 u/ K8 }/ g9 U Q" q. g$ Y
"log"3 ?8 S) z' h2 E# i2 |
"os"
); [( N! `5 ^/ m
func main() {: d8 u& x4 ?7 n
if err := GenerateRSAKey(); err != nil {! E; K! ~8 m6 m. C+ `+ w. J! w
log.Fatal("密钥生成失败")2 M G! F) j' l. X5 h- y
}$ ] p9 g0 x; U, S4 i
log.Println("密钥生成成功")
}9 f" Y( T1 G+ j4 N+ y
func GenerateRSAKey() error {
//1 RSA生成私钥文件步骤
//--1生成RSA私钥对6 |6 b9 `/ e) a5 C
var bits int
flag.IntVar(&bits,"key flag",1024,"密钥长度,默认值位1024")/ Y8 e* E. k+ ?3 u" U, R" i* _ K
privatekey,err :=rsa.GenerateKey(rand.Reader,bits)# q6 F) P$ k+ k4 v W( F
if err != nil {
return err
}1 j* q7 _) a' Q! B- s9 h
//--2.将私钥对象转换为DER编码形式
derPribateKey := x509.MarshalPKCS1PrivateKey(privatekey)
//--3.创建私钥pem文件! @3 _3 t7 f h9 n
file,err := os.Create("./files/private.pem")/ g: d5 u7 a8 |' h
if err != nil {
return err, V2 ?+ S$ f9 L
}7 v( ^% N _' p1 }; N
//--4.对私钥信息进行编码,写入到私钥文件中+ Q' A$ x. W: R' h
block := &pem.Block{
Type: "RSA PRIVATE KEY",9 ^# H& S. r; K2 W3 }% E
Bytes: derPribateKey,
}
err = pem.Encode(file,block)0 i1 b k8 l! t e0 H+ U) `
if err != nil {' U, n5 F9 `" z, B1 V: X* @$ ?
return err
}
//2 RSA生成公钥文件的核心步骤& S# e' A6 H' p" q8 l
//--1.生成公钥对象- c* [# h6 i' x; a0 H
publickey := &privatekey.PublicKey7 V0 s- W2 }# g2 i* S
//--2.将公钥对象转换为DER编码形式0 t* B# A# s% Y1 X! V8 \9 u$ W
derpublicKey,err := x509.MarshalPKIXPublicKey(publickey)! y3 d/ b. K# C5 j B1 s2 k
if err != nil {
return err" C p) m: ]2 Q3 e
}
//--3.创建公钥pem文件5 m$ M8 ]9 t5 W6 H' l
file,err = os.Create("./files/public.pem")0 T k) ~# M c) u0 K) X4 B
if err != nil {7 I1 Y- q& w# U1 m& T+ v7 o/ M
return err
}' S" C" Z( F& {9 J: ~' V
//--4.对公钥信息进行编码,写入公钥文件中
block = &pem.Block{
Type: "PUBLIC KEY",
Bytes: derpublicKey,
}
err = pem.Encode(file,block)
if err != nil {6 y7 F* o7 p1 j8 p; R3 P* m
return err/ d% J/ j& M( |0 Y0 [8 ~- a
}
return nil9 l1 D$ i8 s# }
}4 L; i( `/ I, q1 x) J7 |
执行后,自动在files目录下生成加密过后的公私钥文件,如下
成为第一个吐槽的人