GO实现非对称加密--RSA生成公钥私钥
吃瓜围观小分队
发表于 2023-1-12 12:13:44
191
0
0
import (
"crypto/rand"
"crypto/rsa"# ^5 I# r( g0 u7 p$ r
"crypto/x509"
"encoding/pem"
"flag"3 e6 I" H+ C! |3 [. d
"log"4 z ^+ x6 f* q# N
"os"
)( c. m" C, i7 u' e6 `3 k: z
func main() {
if err := GenerateRSAKey(); err != nil {. R9 G. b* @+ E; L; t8 H
log.Fatal("密钥生成失败")
}' d+ m% D3 j5 ]3 _* h& Z
log.Println("密钥生成成功")0 K% V Y& T( v7 v( z+ |2 v
}
func GenerateRSAKey() error {5 Y4 X" [4 t$ F3 n* |8 ^
//1 RSA生成私钥文件步骤. W( F* k$ ~( L% Y( {! n% t! k* N
//--1生成RSA私钥对
var bits int m5 p. ~" J$ V5 |0 Q( K
flag.IntVar(&bits,"key flag",1024,"密钥长度,默认值位1024")
privatekey,err :=rsa.GenerateKey(rand.Reader,bits)
if err != nil {
return err
}6 N; |# q8 K& f o" f4 s) v* O
//--2.将私钥对象转换为DER编码形式4 I9 j5 S% }7 Y2 X- z% g- f3 ?' g4 A
derPribateKey := x509.MarshalPKCS1PrivateKey(privatekey), l! [$ e5 a1 t8 ^+ v& y
//--3.创建私钥pem文件: [/ b: i' H1 M( x& {. ] z
file,err := os.Create("./files/private.pem")6 g3 e: y" v6 Z6 o
if err != nil {& @8 k& m, K+ A* b& ?. [9 |
return err
}, J5 [& N6 Q1 U
//--4.对私钥信息进行编码,写入到私钥文件中
block := &pem.Block{
Type: "RSA PRIVATE KEY",, D0 L2 A$ l v& q! F
Bytes: derPribateKey,; g, `: n' X9 {: } m
}
err = pem.Encode(file,block)5 O6 U: h1 k- k$ n& z+ J
if err != nil {, \# r' k* l. V& z, G! ^ {5 l
return err( B& H$ N4 V5 l9 Q, ~" I8 @
}0 b* {7 u' T0 l' ~( q
//2 RSA生成公钥文件的核心步骤$ T/ T1 Z' f# V, P4 C# [& p1 I9 I
//--1.生成公钥对象
publickey := &privatekey.PublicKey
//--2.将公钥对象转换为DER编码形式4 Q& I2 Y" F) q8 H( `4 v1 I6 r, n
derpublicKey,err := x509.MarshalPKIXPublicKey(publickey)" {3 N D& E/ A( N' y: J& O# Y
if err != nil {) ]" j8 A1 K9 K, R5 ]
return err7 J% r+ ?4 }1 z( U& _8 x0 S
}
//--3.创建公钥pem文件4 ~" B4 p8 U7 `' Q1 ]8 A7 w% F7 z- t" ?
file,err = os.Create("./files/public.pem")# H( m& R6 H" W$ n0 Q. J) ~. h
if err != nil {
return err. G8 L2 Z/ T- \& _9 J$ ~* K5 v
}- B) v3 T) q' |' i) B% Y* u9 r
//--4.对公钥信息进行编码,写入公钥文件中: i- U, N. z+ H# ?5 l% C1 M
block = &pem.Block{
Type: "PUBLIC KEY",
Bytes: derpublicKey,
}$ @/ E% t' Z0 ?6 N- M S* z* r5 k
err = pem.Encode(file,block)
if err != nil {
return err
}' ~9 H% m/ J* V6 K+ P0 q( C
return nil
}( x6 c; `* C$ [3 U, |
执行后,自动在files目录下生成加密过后的公私钥文件,如下
成为第一个吐槽的人