golang Golang RSA密钥生成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang Golang RSA密钥生成相关的知识,希望对你有一定的参考价值。

/*
 * Genarate rsa keys.
 */

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/asn1"
	"encoding/gob"
	"encoding/pem"
	"fmt"
	"os"
)

func main() {
	reader := rand.Reader
	bitSize := 2048

	key, err := rsa.GenerateKey(reader, bitSize)
	checkError(err)

	publicKey := key.PublicKey

	saveGobKey("private.key", key)
	savePEMKey("private.pem", key)

	saveGobKey("public.key", publicKey)
	savePublicPEMKey("public.pem", publicKey)
}

func saveGobKey(fileName string, key interface{}) {
	outFile, err := os.Create(fileName)
	checkError(err)
	defer outFile.Close()

	encoder := gob.NewEncoder(outFile)
	err = encoder.Encode(key)
	checkError(err)
}

func savePEMKey(fileName string, key *rsa.PrivateKey) {
	outFile, err := os.Create(fileName)
	checkError(err)
	defer outFile.Close()

	var privateKey = &pem.Block{
		Type:  "PRIVATE KEY",
		Bytes: x509.MarshalPKCS1PrivateKey(key),
	}

	err = pem.Encode(outFile, privateKey)
	checkError(err)
}

func savePublicPEMKey(fileName string, pubkey rsa.PublicKey) {
	asn1Bytes, err := asn1.Marshal(pubkey)
	checkError(err)

	var pemkey = &pem.Block{
		Type:  "PUBLIC KEY",
		Bytes: asn1Bytes,
	}

	pemfile, err := os.Create(fileName)
	checkError(err)
	defer pemfile.Close()

	err = pem.Encode(pemfile, pemkey)
	checkError(err)
}

func checkError(err error) {
	if err != nil {
		fmt.Println("Fatal error ", err.Error())
		os.Exit(1)
	}
}

golang 中,非对称加密的实现

golang 中,非对称加密的实现



mysra.go

package main

import (

"crypto/rand"

"crypto/rsa"

"crypto/sha256"

"crypto/x509"

"encoding/hex"

"encoding/pem"

"fmt"

"os"

)

// 生成rsa的密钥对, 并且保存到磁盘文件中

func GenerateRsaKey(keySize int) {

// 1. 使用rsa中的GenerateKey方法生成私钥

privateKey, err := rsa.GenerateKey(rand.Reader, keySize)

if err != nil {

panic(err)

}

// 2. 通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串

derText := x509.MarshalPKCS1PrivateKey(privateKey)

// 3. 要组织一个pem.Block(base64编码)

block := pem.Block{

Type : "rsa private key", // 这个地方写个字符串就行

Bytes : derText,

}

// 4. pem编码

file, err := os.Create("private.pem")

if err != nil {

panic(err)

}

pem.Encode(file, &block)

file.Close()

// ============ 公钥 ==========

// 1. 从私钥中取出公钥

publicKey := privateKey.PublicKey

// 2. 使用x509标准序列化

derstream, err := x509.MarshalPKIXPublicKey(&publicKey)

if err != nil {

panic(err)

}

// 3. 将得到的数据放到pem.Block中

block = pem.Block{

Type : "rsa public key",

Bytes : derstream,

}

// 4. pem编码

file, err = os.Create("public.pem")

if err != nil {

panic(err)

}

pem.Encode(file, &block)

file.Close()

}

// RSA 加密, 公钥加密

func RSAEncrypt(plainText []byte, fileName string) []byte{

// 1. 打开文件, 并且读出文件内容

file, err := os.Open(fileName)

if err != nil {

panic(err)

}

fileInfo, err := file.Stat()

if err != nil {

panic(err)

}

buf := make([]byte, fileInfo.Size())

file.Read(buf)

file.Close()

// 2. pem解码

block, _ := pem.Decode(buf)

pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)

//断言类型转换

pubKey := pubInterface.(*rsa.PublicKey)

// 3. 使用公钥加密

cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, plainText)

if err != nil {

panic(err)

}

return cipherText

}

// RSA 解密

func RSADecrypt(cipherText []byte, fileName string) []byte{

// 1. 打开文件, 并且读出文件内容

file, err := os.Open(fileName)

if err != nil {

panic(err)

}

fileInfo, err := file.Stat()

if err != nil {

panic(err)

}

buf := make([]byte, fileInfo.Size())

file.Read(buf)

file.Close()

// 2. pem解码

block, _ := pem.Decode(buf)

privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)

if err != nil {

panic(err)

}

// 3. 使用私钥解密

plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privKey, cipherText)

if err != nil {

panic(err)

}

return plainText

}

func main() {

GenerateRsaKey(4096)

src := []byte(" 好好学习,天天向上... 好好学习,天天向上... 好好学习,天天向上... 好好学习,天天向上... 好好学习,天天向上...")

cipherText := RSAEncrypt(src, "public.pem")

plainText := RSADecrypt(cipherText, "private.pem")

fmt.Println(string(plainText))

myHash()

}

// 使用sha256

func myHash() {

// sha256.Sum256([]byte("hello, go"))

// 1. 创建哈希接口对象

myHash := sha256.New()

// 2. 添加数据

src := []byte(" 好好学习,天天向上... 好好学习,天天向上... 好好学习,天天向上... 好好学习,天天向上... 好好学习,天天向上...")

myHash.Write(src)

myHash.Write(src)

myHash.Write(src)

// 3. 计算结果

res := myHash.Sum(nil)

// 4. 格式化为16进制形式

myStr := hex.EncodeToString(res)

fmt.Printf("%s\n", myStr)

}

防爬虫说明

禁止 学习某地爬虫,知乎爬虫,CSDN 爬虫。

本文,首发在 learnku 社区。

@author
汪春波(www.shxdledu.cn)


以上是关于golang Golang RSA密钥生成的主要内容,如果未能解决你的问题,请参考以下文章

golang 中,非对称加密的实现

golang实现京东支付v2版本

GoLang执行需要输入密码的命令

Golang 实现RSA加密解密

使用 ssh golang 包解析 ssh 密钥

golang 用于生成凭证密钥对的App命令