GO实现非对称加密--RSA生成公钥私钥
吃瓜围观小分队
发表于 2023-1-12 12:13:44
274
0
0
import (( d0 Q2 T& p5 ?, m
"crypto/rand"
"crypto/rsa"
"crypto/x509"( j$ o- G' x! x) e+ o, p
"encoding/pem": O* S% k) b5 v& b+ Q, O
"flag"' Q% n( Y8 f1 x3 I$ U9 s
"log"! F/ s& T% g g# r7 ?$ ~$ l1 [
"os"
)6 k3 }8 _* P7 N T1 z+ {( F
func main() {
if err := GenerateRSAKey(); err != nil {
log.Fatal("密钥生成失败")
}
log.Println("密钥生成成功")" n% [- N4 X6 a1 j- U* [8 V( j
}! D: s/ E. _/ s6 y
func GenerateRSAKey() error {
//1 RSA生成私钥文件步骤1 U- k) M' O2 Y8 G. R
//--1生成RSA私钥对. H+ O* B1 g5 \1 W, C4 g* V2 n- B: D
var bits int, u: }- o5 M, H2 N+ p
flag.IntVar(&bits,"key flag",1024,"密钥长度,默认值位1024")
privatekey,err :=rsa.GenerateKey(rand.Reader,bits)
if err != nil {1 h5 J* s: F Q d
return err
}
//--2.将私钥对象转换为DER编码形式
derPribateKey := x509.MarshalPKCS1PrivateKey(privatekey)! _( ?6 S1 G* |/ ^" w, Z( J
//--3.创建私钥pem文件
file,err := os.Create("./files/private.pem")
if err != nil {7 o& g2 }& L, T3 y$ `( K- M' K, f
return err
}5 i V# Q2 p# [3 E. Q
//--4.对私钥信息进行编码,写入到私钥文件中# b% [) s0 p. b$ p' V. F
block := &pem.Block{( B8 ` P: }/ D2 ~& c! m1 O
Type: "RSA PRIVATE KEY",' q( M- L: L( ^) R! S' B' q
Bytes: derPribateKey,' O F/ E% b& y+ T: W
}4 K, G, W+ z& L5 P6 u7 P1 |
err = pem.Encode(file,block)
if err != nil {6 |3 _, C' ~0 |4 \* w3 _. w
return err
}
//2 RSA生成公钥文件的核心步骤
//--1.生成公钥对象: j7 c. P2 j+ K! Q5 [' R) C. O9 l
publickey := &privatekey.PublicKey- y; e2 ` M- c U6 K. e
//--2.将公钥对象转换为DER编码形式
derpublicKey,err := x509.MarshalPKIXPublicKey(publickey)* H% r8 C# }( r6 s" ~/ Y
if err != nil {. }; J: Z# Z' x( A* m. b, Y
return err
}/ `+ e8 N* |" ~; R
//--3.创建公钥pem文件) A7 Y6 V2 i. {) r- `0 [. X( E% n
file,err = os.Create("./files/public.pem")4 M7 I, g" M. ^' m1 E) P
if err != nil {2 P L+ j# Y/ Q- w( D6 T
return err
}
//--4.对公钥信息进行编码,写入公钥文件中9 H! c6 N* L# s& d
block = &pem.Block{) e0 H9 s+ [7 S
Type: "PUBLIC KEY",) a% E6 ~" F" d
Bytes: derpublicKey,, [* F; b) Y7 q2 n) b! D. k6 Z" |
}6 k7 D' d$ e" x
err = pem.Encode(file,block)
if err != nil {0 n3 V0 H$ b5 b8 j
return err! A7 O% K" z; z, h- V
}
return nil- z2 M8 ]* {8 I6 a( M9 }1 O
}; z) K s' Q3 s8 `
执行后,自动在files目录下生成加密过后的公私钥文件,如下
成为第一个吐槽的人