encoding/pem

2024-06-11 01:08
文章标签 encoding pem

本文主要是介绍encoding/pem,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pem包实现了PEM数据编码(源自保密增强邮件协议)。目前PEM编码主要用于TLS密钥和证书

PEM 编码格式如下

-----BEGIN Type-----
Headers
base64-encoded Bytes
-----END Type-----

编码

func Encode(out io.Writer, b *Block) error

type Block struct {Type    string            // 得自前言的类型(如"RSA PRIVATE KEY")Headers map[string]string // 可选的头项Bytes   []byte            // 内容解码后的数据,一般是DER编码的ASN.1结构
}

下面我们就以ras加密方式为例,看一个pem编码的实现过程

package mainimport ("crypto/rsa""crypto/rand""fmt""encoding/pem""crypto/x509""os""log""io/ioutil""errors"
)
var privite_key_path = "/Users/xujie/go/src/awesomeProject/main/private.pem"
var public_key_path = "/Users/xujie/go/src/awesomeProject/main/public.pem"func main() {// 生成公钥和私钥generatePublick(generatePrivate())src := []byte(`{"name":"酷走天涯"}`)// 公钥加密cryptoData,error := rsaEncrypt(src)if error != nil {log.Fatal(error)}fmt.Println("加密:",cryptoData)// 私钥解密dst,error := rsaDecrypt(cryptoData)if error != nil {log.Fatal(error)}fmt.Println("解密:",string(dst))
}// 生成私钥
func generatePrivate() *rsa.PrivateKey{privateKey,error :=  rsa.GenerateKey(rand.Reader,2048)if error != nil {fmt.Println(error)}derStream := x509.MarshalPKCS1PrivateKey(privateKey)block := &pem.Block{Type:"RSA PRIVATE KEY",Bytes:derStream}file,error := os.Create(privite_key_path)if error != nil {fmt.Println(error)}error = pem.Encode(file,block)if error != nil {fmt.Println(error)}return privateKey
}// 生成公钥
func generatePublick(privateKey *rsa.PrivateKey){publicKey := privateKey.Public()derStream,error := x509.MarshalPKIXPublicKey(publicKey)if error != nil{fmt.Println(error)}block := &pem.Block{Type:"RSA PUBLIC KEY",Bytes:derStream}file,error := os.Create(public_key_path)if error != nil {fmt.Println(error)}error = pem.Encode(file,block)if error != nil {fmt.Println(error)}
}// 公钥加密
func rsaEncrypt(origData []byte) ([]byte, error) {// 从文件中读取公钥编码字节流file,error := os.Open(public_key_path)if error != nil{log.Fatal(error)}publicKey,error := ioutil.ReadAll(file)if error != nil{log.Fatal(error)}// 解码对应的block块数据block, _ := pem.Decode(publicKey)if block == nil {return nil, errors.New("public key error")}// 获取公钥key值pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil {return nil, err}pub := pubInterface.(*rsa.PublicKey)// 加密数据return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}// 私钥解密
func rsaDecrypt(ciphertext []byte) ([]byte, error) {// 从文件中读取私钥pem字节流file,error := os.Open(privite_key_path)if error != nil{log.Fatal(error)}privateKey,error := ioutil.ReadAll(file)if error != nil{log.Fatal(error)}// 解码出对应的block值block, _ := pem.Decode(privateKey)if block == nil {return nil, errors.New("private key error!")}// 获取私钥对象priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)if err != nil {return nil, err}// 解密文件return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
}
1594482-8d4ee05dbae4f6ce.png
image.png

rsa.GenerateKey(rand.Reader,2048) 2048 是默认的的数据长度,也可以设置其他值

这篇关于encoding/pem的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049788

相关文章

[LeetCode] 820. Short Encoding of Words

题:https://leetcode.com/problems/short-encoding-of-words/ 题目大意 参考题目 思路 set 集合 将所有word 放入set中,然后遍历所有set中的word,将word的从头的子串都从set中删除,最后统计 set中所有(word 的长度 + 1)(’#’) class Solution {public int minimumL

whose UTF8 encoding is longer than the max length 32766

问题描述:java.lang.IllegalArgumentException: Document contains at least one immense term in field=“cf_jg.keyword” (whose UTF8 encoding is longer than the max length 32766) 原因:设置为keyword类型的字段,插入很长的大段内容后,报

自然语言处理(NLP)-子词模型(Subword Models):BPE(Byte Pair Encoding)、WordPiece、ULM(Unigram Language Model)

在NLP任务中,神经网络模型的训练和预测都需要借助词表来对句子进行表示。传统构造词表的方法,是先对各个句子进行分词,然后再统计并选出频数最高的前N个词组成词表。通常训练集中包含了大量的词汇,以英语为例,总的单词数量在17万到100万左右。出于计算效率的考虑,通常N的选取无法包含训练集中的所有词。因而,这种方法构造的词表存在着如下的问题: 实际应用中,模型预测的词汇是开放的,对于未在词表中出现的词

【位置编码】【Positional Encoding】直观理解位置编码!把位置编码想象成秒针!

【位置编码】【Positional Encoding】直观理解位置编码!把位置编码想象成秒针! 你们有没有好奇过为啥位置编码非得长成这样: P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i / d m o d e l

PHP Curl Content-Encoding: gzip乱码问题解决

笔者在使用php curl对接hugegraph的过程中,发现向gremlin发送结果返回乱码,截图如下: 对比这个请求和普通的请求:       发现返回乱码的乱码请求中有Content-Encoding: gzip,即返回的内容采用了gzip压缩,所以需要在curl请求中加入 curl_setopt($curl, CURLOPT_ENCODING, 'gzip'); 即返回正常。

什么是大模型的位置编码Position Encoding?

1. 什么是位置编码 位置编码(Positional Encoding)是一种在处理序列数据时,用于向模型提供序列中每个元素位置信息的技术。 在自然语言处理(NLP)中,尤其是在使用Transformer模型时,位置编码尤为重要,因为Transformer模型本身并不包含处理序列顺序的机制。 位置编码的主要目的是让模型能够区分输入序列中词的顺序,从而更好地理解句子的结构和含义。 2.

PEM燃料电池启停控制策略优化的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 PEM燃料电池启停控制策略优化的simulink建模与仿真。 1.燃料电池提供是燃料转换为电能和热能的装置。 2.功率的输出的改变通过很多因素,如温度,压力和老化。 3.长时间的使用也降低了燃料电池的功率。 4.这个过程通过操作有很大的影响。很高的流体动力学,当

iOS:苹果推送--pem证书的生成

转载于:http://blog.sina.com.cn/s/blog_6afb7d800101fafl.html pem文件是服务器向苹果服务器做推送时候需要的文件,主要是做服务器的小伙伴们要用,下面介绍一下pem文件的生成。 打开KeychainAccess,在Certificates里面找到上篇文章中介绍的包含推送的证书。分别将certificate和privatekey导出得到.p12

苹果推送----pem证书的生成

转载于:http://blog.sina.com.cn/s/blog_6afb7d800101fafl.html pem文件是服务器向苹果服务器做推送时候需要的文件,主要是做服务器的小伙伴们要用,下面介绍一下pem文件的生成。 打开KeychainAccess,在Certificates里面找到上篇文章中介绍的包含推送的证书。分别将certificate和privatekey导出得到.p12文

error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm

备注:本笔记所描述的问题的前提是机器上已安装成功git且通过配置ca证书支持以https方式获取远程仓库,如果使用git时碰到这篇文章描述的问题,那么按那篇文章给出的办法解决即可。 最近从github clone repo时,git clone命令报错如下(以vim代码补全插件youcompleteme为例): ? 1 2 3 $ git clone https: