这篇文章将为大家详细讲解有关golang中怎么生成密钥对,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
利用golang的官方包生成密钥对.
生成密钥对方法:
// generateRsaKey 密钥func generateRsaKey(bits int) (err error) { var ( file *os.File priKey *rsa.PrivateKey pubKey *rsa.PublicKey ) // 获取私钥 if priKey, err = rsa.GenerateKey(rand.Reader, bits); err != nil { return } // 将私钥转换为ASN.1 DER编码形式。 derStream := x509.MarshalPKCS1PrivateKey(priKey) // 私钥参数 block := &pem.Block{ Type: "privateKey", Headers: map[string]string{"test": "testKey"}, Bytes: derStream, } // 创建private.key文件 if file, err = os.Create("private.key"); err != nil { return } // 在文件里面写入数据 if err = pem.Encode(file, block); err != nil { return } // 获取公钥 pubKey = &priKey.PublicKey if _derPkix, _err := x509.MarshalPKIXPublicKey(pubKey); _err != nil { err = _err return } else { block = &pem.Block{ Type: "publicKey", Headers: map[string]string{"test": "testKey"}, Bytes: _derPkix, } } // 创建公钥文件 if file, err = os.Create("public.key"); err != nil { return } // 写入数据 if err = pem.Encode(file, block); err != nil { return } return}
解析私钥获取其长度:
// getPrivateKeyLen 获取私钥长度func getPrivateKeyLen(private []byte) (ret int, err error) { block, _ := pem.Decode(private) var ( data *rsa.PrivateKey ) if data, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { return } ret = data.N.BitLen() return}
解析公钥获取长度:
// getPublicKeyLen 获取公钥长度func getPublicKeyLen(public []byte) (ret int, err error) { var ( block *pem.Block data interface{} ) // 解码 block, _ = pem.Decode(public) // 解析出数据 if data, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { return } // 分析数据 switch v := data.(type) { case *rsa.PublicKey: ret = v.N.BitLen() default: err = errors.New("data type is not rsa.PublicKey") } return}
main函数:
导入的包:
import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "errors" "flag" "fmt" "io/ioutil" "os")
func main() { var ( bits int err error pubKey, priKey []byte n int ) flag.IntVar(&bits, "b", 1024, "密钥长度,默认为1024位") flag.Parse() // 生成密钥对 if err = generateRsaKey(bits); err != nil { panic(err) } if priKey, err = ioutil.ReadFile("private.pem"); err != nil { return } if pubKey, err = ioutil.ReadFile("public.pem"); err != nil { return } // 获取长度 if n, err = getPrivateKeyLen(priKey); err == nil { fmt.Printf("private key len is %d\n", n) } else { panic(err) } // 获取长度 if n, err = getPublicKeyLen(pubKey); err == nil { fmt.Printf("public key len is %d\n", n) } else { panic(err) }}
关于golang中怎么生成密钥对就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/olongfen/blog/4467253