婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang 如何獲取pem格式RSA公私鑰長度

golang 如何獲取pem格式RSA公私鑰長度

熱門標(biāo)簽:不封卡外呼系統(tǒng) 寧波語音外呼系統(tǒng)公司 重慶慶云企業(yè)400電話到哪申請 地圖標(biāo)注免費(fèi)定制店 鄭州智能語音電銷機(jī)器人價(jià)格 湛江crm外呼系統(tǒng)排名 上海極信防封電銷卡價(jià)格 仙桃400電話辦理 宿遷便宜外呼系統(tǒng)代理商

因在做license注冊機(jī)制當(dāng)中,有對根據(jù)本地RSA pem密鑰文件判斷出RSA的公私密鑰長度的需求(即:根據(jù)pem內(nèi)容判斷出RSA密鑰是1024位或者2048位,或者其他位數(shù)等),因此個人通過思考,摸索整理出一個方法,予以記錄,備用,分享。

package main
import (
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"errors"
	"fmt"
	"io/ioutil"
	"os"
)
//全局變量
var privateKey, publicKey []byte
func init() {
	var err error
	publicKey, err = ioutil.ReadFile("public.pem")
	if err != nil {
		os.Exit(-1)
	}
	privateKey, err = ioutil.ReadFile("private.pem")
	if err != nil {
		os.Exit(-1)
	}
}
/**
 * @brief 獲取RSA公鑰長度
 * @param[in]    PubKey				  RSA公鑰
 * @return  成功返回 RSA公鑰長度,失敗返回error	錯誤信息
 */
func GetPubKeyLen(PubKey []byte) (int, error) {
	if PubKey == nil {
		return 0, errors.New("input arguments error")
	}
	block, _ := pem.Decode(PubKey)
	if block == nil {
		return 0, errors.New("public rsaKey error")
	}
	pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return 0, err
	}
	pub := pubInterface.(*rsa.PublicKey)
	return pub.N.BitLen(), nil
}
/**
 * @brief 獲取RSA私鑰長度
 * @param[in]    PriKey				  RSA私鑰
 * @return  成功返回 RSA私鑰長度,失敗返回error	錯誤信息
 */
func GetPriKeyLen(PriKey []byte) (int, error) {
	if PriKey == nil {
		return 0, errors.New("input arguments error")
	}
	block, _ := pem.Decode(PriKey)
	if block == nil {
		return 0, errors.New("private rsaKey error!")
	}
	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		return 0, err
	}
	return priv.N.BitLen(), nil
}
func main() {
	//獲取rsa 公鑰長度
	PubKeyLen, _ := GetPubKeyLen(publicKey)
	fmt.Println("pbulic key len is ", PubKeyLen)
	//獲取rsa 私鑰長度
	PriKeyLen, _ := GetPriKeyLen(privateKey)
	fmt.Println("private key len is ", PriKeyLen)
}

附錄:以下程序是產(chǎn)生RSA公私密鑰的程序,附件,方便測試。

package main
import (
 "crypto/rand"
 "crypto/rsa"
 "crypto/x509"
 "encoding/pem"
 "flag"
 "log"
 "os"
)
func main() {
 var bits int
 flag.IntVar(bits, "b", 1024, "密鑰長度,默認(rèn)為1024位")
 flag.Parse()
 
 if err := GenRsaKey(bits); err != nil {
 log.Fatal("密鑰文件生成失敗!")
 }
 log.Println("密鑰文件生成成功!")
}
func GenRsaKey(bits int) error {
 // 生成私鑰文件
 privateKey, err := rsa.GenerateKey(rand.Reader, bits)
 if err != nil {
 return err
 }
 derStream := x509.MarshalPKCS1PrivateKey(privateKey)
 block := pem.Block{
 Type: "私鑰",
 Bytes: derStream,
 }
 file, err := os.Create("private.pem")
 if err != nil {
 return err
 }
 err = pem.Encode(file, block)
 if err != nil {
 return err
 }
 // 生成公鑰文件
 publicKey := privateKey.PublicKey
 derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
 if err != nil {
 return err
 }
 block = pem.Block{
 Type: "公鑰",
 Bytes: derPkix,
 }
 file, err = os.Create("public.pem")
 if err != nil {
 return err
 }
 err = pem.Encode(file, block)
 if err != nil {
 return err
 }
 return nil
}

補(bǔ)充:golang 使用RSA生成公私鑰,加密,解密,并使用SHA256進(jìn)行簽名,驗(yàn)證

話不多說直接上代碼:

package main
import (
	"crypto"
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"crypto/x509"
	"encoding/hex"
	"encoding/pem"
	"errors"
	"fmt"
)
func main() {
	//rsa 密鑰文件產(chǎn)生
	fmt.Println("-------------------------------獲取RSA公私鑰-----------------------------------------")
	prvKey, pubKey := GenRsaKey()
	fmt.Println(string(prvKey))
	fmt.Println(string(pubKey))
	fmt.Println("-------------------------------進(jìn)行簽名與驗(yàn)證操作-----------------------------------------")
	var data = "臥了個槽,這么神奇的嗎??!!! ԅ(¯﹃¯ԅ) !!!!!!)"
	fmt.Println("對消息進(jìn)行簽名操作...")
	signData := RsaSignWithSha256([]byte(data), prvKey)
	fmt.Println("消息的簽名信息: ", hex.EncodeToString(signData))
	fmt.Println("\n對簽名信息進(jìn)行驗(yàn)證...")
	if RsaVerySignWithSha256([]byte(data), signData, pubKey) {
		fmt.Println("簽名信息驗(yàn)證成功,確定是正確私鑰簽名!!")
	}
	fmt.Println("-------------------------------進(jìn)行加密解密操作-----------------------------------------")
	ciphertext := RsaEncrypt([]byte(data), pubKey)
	fmt.Println("公鑰加密后的數(shù)據(jù):", hex.EncodeToString(ciphertext))
	sourceData := RsaDecrypt(ciphertext, prvKey)
	fmt.Println("私鑰解密后的數(shù)據(jù):", string(sourceData))
}
//RSA公鑰私鑰產(chǎn)生
func GenRsaKey() (prvkey, pubkey []byte) {
	// 生成私鑰文件
	privateKey, err := rsa.GenerateKey(rand.Reader, 1024)
	if err != nil {
		panic(err)
	}
	derStream := x509.MarshalPKCS1PrivateKey(privateKey)
	block := pem.Block{
		Type: "RSA PRIVATE KEY",
		Bytes: derStream,
	}
	prvkey = pem.EncodeToMemory(block)
	publicKey := privateKey.PublicKey
	derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
	if err != nil {
		panic(err)
	}
	block = pem.Block{
		Type: "PUBLIC KEY",
		Bytes: derPkix,
	}
	pubkey = pem.EncodeToMemory(block)
	return
}
//簽名
func RsaSignWithSha256(data []byte, keyBytes []byte) []byte {
	h := sha256.New()
	h.Write(data)
	hashed := h.Sum(nil)
	block, _ := pem.Decode(keyBytes)
	if block == nil {
		panic(errors.New("private key error"))
	}
	privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		fmt.Println("ParsePKCS8PrivateKey err", err)
		panic(err)
	}
	signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed)
	if err != nil {
		fmt.Printf("Error from signing: %s\n", err)
		panic(err)
	}
	return signature
}
//驗(yàn)證
func RsaVerySignWithSha256(data, signData, keyBytes []byte) bool {
	block, _ := pem.Decode(keyBytes)
	if block == nil {
		panic(errors.New("public key error"))
	}
	pubKey, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		panic(err)
	}
	hashed := sha256.Sum256(data)
	err = rsa.VerifyPKCS1v15(pubKey.(*rsa.PublicKey), crypto.SHA256, hashed[:], signData)
	if err != nil {
		panic(err)
	}
	return true
}
// 公鑰加密
func RsaEncrypt(data, keyBytes []byte) []byte {
	//解密pem格式的公鑰
	block, _ := pem.Decode(keyBytes)
	if block == nil {
		panic(errors.New("public key error"))
	}
	// 解析公鑰
	pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		panic(err)
	}
	// 類型斷言
	pub := pubInterface.(*rsa.PublicKey)
	//加密
	ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, pub, data)
	if err != nil {
		panic(err)
	}
	return ciphertext
}
// 私鑰解密
func RsaDecrypt(ciphertext, keyBytes []byte) []byte {
	//獲取私鑰
	block, _ := pem.Decode(keyBytes)
	if block == nil {
		panic(errors.New("private key error!"))
	}
	//解析PKCS1格式的私鑰
	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		panic(err)
	}
	// 解密
	data, err := rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
	if err != nil {
		panic(err)
	}
	return data
}

運(yùn)行結(jié)果:

-------------------------------獲取RSA公私鑰-----------------------------------------
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCgPwlGJrWqTYaoMkI8jXkEI8ewQ7E57G2Fi91WTXMMK7X6GsT9
VmnRcq++Rk/VS+4IPBlfWyVRg0NfQDyuKjed21fUPa9AIbpYWHgP/tojyeYC1+Ra
Xncrt9kLp7nW4FZMJmzwU9hfxIB0nhDQqhJenjdBZuYZfkICfMqyqbVkAwIDAQAB
AoGAJRcSDXOuPrHdBhdD74ILTaL+eFTis3Z+zxdVbsFUbK+9WhtSFxUmPv1dohvi
JIuDl9JZSRHurFRGhsh2gxVwc7JXwWfD0DmD8dvdzr8q85Jml9YVZ7uhHFqSO4cY
I7dlBOd7Uwjnc39E/d+1E/kWVNfKt7opPHgt02zOHLSxkbECQQDS7H3myu3oLOi0
Slpd1MmmHVOo2cqJ1b3H6E8JtEjmHGswWTYvQNAe4yZ+Kffsp5LUYujedncPKvEj
4G+iz44bAkEAwn4Bx30FKTri/tybgSnCWKwTGSX479829Xucrm5pYU/3D5/PeJQL
Ra4YSyg2/hU3ZBrue6CdzYJgGXNGEWhAOQJBALMlOB4A96X+FruidzRA2fBj8j10
lakSSHl1H0RfwpbnRkcvTm0+AEZrqbL4lGGFRplrVNw2BBN25o8RPeArp0cCQEhu
kw0PI1fqhVUzJXqh6a4KT4aDHMWAlMAxi/VuSzKhjDo2Yxbd06DcqFF9JZXUou9W
FFDYTUyW7GEuC/85mwkCQCOEjUQX0C3JCSr6fyZIjpEr+znyc9eFHyBp+533Ur4g
eFu2ewJ3ufJiUBmEj1rEQku8W7h9DS2rXl10IiSwUAA=
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgPwlGJrWqTYaoMkI8jXkEI8ew
Q7E57G2Fi91WTXMMK7X6GsT9VmnRcq++Rk/VS+4IPBlfWyVRg0NfQDyuKjed21fU
Pa9AIbpYWHgP/tojyeYC1+RaXncrt9kLp7nW4FZMJmzwU9hfxIB0nhDQqhJenjdB
ZuYZfkICfMqyqbVkAwIDAQAB
-----END PUBLIC KEY-----
-------------------------------進(jìn)行簽名與驗(yàn)證操作-----------------------------------------
對消息進(jìn)行簽名操作...
消息的簽名信息: 24a29efbc27e7b84c3b0eed683af28915381b2a0312f5383143cd2006b804d3a16c2b4750fb1857445b46664b795b6cefd402c5cf25e0f28116b7b50f5c16e80af9f9481def0161c6dac7a5d05c56595b891d84091e444ef4012ba1a0efd5cd2ff17c6dfdc109a2a3349ae2523217706a03042ea16d84fcf7d3dae37ee36d2e8
對簽名信息進(jìn)行驗(yàn)證...
簽名信息驗(yàn)證成功,確定是正確私鑰簽名!!
-------------------------------進(jìn)行加密解密操作-----------------------------------------
公鑰加密后的數(shù)據(jù): 2b34d46a62317f4f5e5c8618671831c0970cef2eeddc0d3aca02e1d5b411a067844e1250a1f69cbb1cbcb0cb1964af85836faa346f9ce9fac2710d4fa18e49ee1c4c73496183952fa95a54dd2d633b115504f0a365bac6d022399059a53f51c474e5e4f0f8eefde61bb85d5d812b67114f5d419c33496acaf11d3d84828733f7
私鑰解密后的數(shù)據(jù): 臥了個槽,這么神奇的嗎??!!! ԅ(¯﹃¯ԅ) !!!!!!)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Go 語言中g(shù)in使用gzip壓縮遇到的問題
  • go判斷文件夾是否存在并創(chuàng)建的實(shí)例
  • go 協(xié)程返回值處理操作
  • golang實(shí)現(xiàn)的文件上傳下載小工具
  • Golang 實(shí)現(xiàn)復(fù)制文件夾同時(shí)復(fù)制文件
  • golang文件讀取-按指定BUFF大小讀取方式
  • 使用go讀取gzip格式的壓縮包的操作

標(biāo)簽:遼寧 物業(yè)服務(wù) 安康 西雙版納 海南 儋州 電子產(chǎn)品 青海

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang 如何獲取pem格式RSA公私鑰長度》,本文關(guān)鍵詞  golang,如何,獲取,pem,格式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang 如何獲取pem格式RSA公私鑰長度》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang 如何獲取pem格式RSA公私鑰長度的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91美女视频网站| 日韩欧美综合在线| 国产精品亚洲а∨天堂免在线| 国产乱对白刺激视频不卡| 色综合视频一区二区三区高清| 欧美日韩一级二级| 26uuu精品一区二区| 一区二区三区中文字幕电影 | 欧美剧情片在线观看| 欧美tk丨vk视频| 亚洲婷婷综合色高清在线| 亚洲一区二区影院| 国产一区在线视频| av激情亚洲男人天堂| 日韩精品一区二区三区老鸭窝| 中文字幕日韩av资源站| 成人免费观看视频| www久久久久| 免费成人性网站| 久久色.com| 久久99国产乱子伦精品免费| 风间由美中文字幕在线看视频国产欧美| 91在线精品一区二区| 国产精品久久久久7777按摩 | 极品美女销魂一区二区三区免费| 在线看不卡av| 国产精品久久久久精k8| 99久久精品国产观看| 欧美一区二区免费视频| 伊人夜夜躁av伊人久久| 日本亚洲欧美天堂免费| 欧美人妇做爰xxxⅹ性高电影 | 久久久久久一二三区| 美女网站一区二区| 国产欧美一区二区精品忘忧草| 国产成人午夜高潮毛片| 欧美一级搡bbbb搡bbbb| 日韩精品电影一区亚洲| 国产成人高清在线| 国产精品久久久99| 91在线精品一区二区三区| 一级日本不卡的影视| 91啪亚洲精品| 亚洲线精品一区二区三区八戒| 欧美日韩综合色| 极品少妇xxxx精品少妇偷拍| 亚洲午夜日本在线观看| 欧美精品成人一区二区三区四区| 日韩avvvv在线播放| 26uuu亚洲综合色欧美 | 欧美成人猛片aaaaaaa| av在线这里只有精品| 自拍偷自拍亚洲精品播放| 日本精品一区二区三区高清 | 中文字幕乱码日本亚洲一区二区| 91小宝寻花一区二区三区| 亚洲欧美另类小说| 一区二区激情小说| 日韩影视精彩在线| 丁香激情综合国产| 国产精品久久久久久久岛一牛影视| 麻豆成人免费电影| 国产拍揄自揄精品视频麻豆| 一本色道久久综合精品竹菊| 裸体在线国模精品偷拍| 亚洲色图视频网| 日韩女优电影在线观看| 色婷婷综合久久久久中文一区二区| 亚瑟在线精品视频| 久久久久综合网| 日韩一级大片在线观看| 成人av高清在线| 久久国产精品99精品国产 | 久久国产精品色| 日本在线观看不卡视频| 最新日韩在线视频| 日韩欧美国产1| 欧美日韩成人激情| 欧美日韩一区二区三区免费看| 91啪九色porn原创视频在线观看| 91久久奴性调教| 国产成人av一区二区三区在线| 亚洲国产乱码最新视频| 1000部国产精品成人观看| 一色屋精品亚洲香蕉网站| 日韩一本二本av| 91麻豆精品91久久久久同性| 91丨porny丨国产| 成人av在线资源网| 成人精品高清在线| 国产河南妇女毛片精品久久久| 久久不见久久见免费视频7| 亚洲一区av在线| 亚洲私人影院在线观看| 欧美国产精品一区二区| 国产色爱av资源综合区| 91官网在线观看| 欧美精三区欧美精三区| 91色porny在线视频| 欧美日韩一区二区三区不卡| 99精品视频一区二区三区| 国产不卡一区视频| 极品少妇一区二区三区精品视频| 91网上在线视频| 99久久精品国产麻豆演员表| 国产suv一区二区三区88区| av电影天堂一区二区在线| 色噜噜久久综合| 色8久久人人97超碰香蕉987| 在线视频欧美精品| 欧美肥妇free| 欧美日韩dvd在线观看| 国产精品久久久久久久久果冻传媒| 中文字幕欧美激情| 丝袜亚洲精品中文字幕一区| 国产一区二区久久| 91麻豆国产自产在线观看| 8x8x8国产精品| 一区二区三区欧美视频| 日韩av电影免费观看高清完整版 | 日本成人在线电影网| 国产91高潮流白浆在线麻豆| 欧美日韩在线免费视频| 制服丝袜国产精品| 亚洲资源在线观看| 久久99精品国产麻豆婷婷| 国模少妇一区二区三区| 91福利在线看| 日韩免费性生活视频播放| 9191精品国产综合久久久久久 | 精品国产制服丝袜高跟| 91精品国产丝袜白色高跟鞋| 精品99一区二区| 国产在线看一区| 91精品国产综合久久久蜜臀图片| 亚洲制服丝袜av| 91久久精品国产91性色tv| 国产日韩一级二级三级| 日韩高清在线观看| 欧美日韩中文字幕一区| 亚洲另类在线制服丝袜| 欧美日韩中文字幕一区二区| 日韩电影在线观看电影| 欧美群妇大交群的观看方式| 国产精品免费看片| 91蜜桃传媒精品久久久一区二区| 国产精品久久影院| 岛国一区二区在线观看| 亚洲另类色综合网站| 91麻豆免费看| 精品国产a毛片| 免费av成人在线| 精品伦理精品一区| 激情av综合网| 国产欧美va欧美不卡在线| 日本高清无吗v一区| 亚洲1区2区3区4区| 91麻豆精品国产91久久久久 | 欧美激情一区二区在线| 久久电影网站中文字幕| 精品国产乱子伦一区| 成人午夜在线免费| 欧美mv日韩mv国产| 国产最新精品精品你懂的| 久久久综合九色合综国产精品| 国产乱码精品1区2区3区| 国产精品乱码妇女bbbb| av成人免费在线| 一区二区三区.www| 欧美日韩亚洲综合| 亚洲国产人成综合网站| 色综合天天视频在线观看| 五月天一区二区三区| 制服丝袜成人动漫| 九色|91porny| 国产亚洲欧美中文| 色综合一个色综合亚洲| 亚洲欧美日韩国产另类专区| 欧美日韩一二三| 久久66热re国产| 国产女主播在线一区二区| 91国偷自产一区二区三区成为亚洲经典 | 26uuu国产电影一区二区| 国产精品毛片无遮挡高清| 91在线视频网址| 亚洲第一精品在线| 欧美一级电影网站| 国内精品伊人久久久久av影院 | 国产在线视频精品一区| 91精品国产麻豆| 日本不卡高清视频| 日韩情涩欧美日韩视频| 麻豆91在线播放| 精品处破学生在线二十三| 国产馆精品极品| 樱花草国产18久久久久| 91精品国产高清一区二区三区| 日韩主播视频在线| 久久这里只有精品6| 国产成人精品午夜视频免费|