相关文章推荐
风度翩翩的创口贴  ·  《同人片子的网站入口》原神vicineko同 ...·  7 月前    · 
闯红灯的大熊猫  ·  faster to re-load ...·  7 月前    · 
考研的麦片  ·  杭州市临安区吴越国衣锦城考古遗址公园管理局2 ...·  8 月前    · 
奔跑的茄子  ·  发展氢能产业,白云凭什么?-广州市白云区人民 ...·  8 月前    · 
挂过科的杯子  ·  湖南省高级人民法院柏广衡等4名同志任前公示_ ...·  9 月前    · 
Code  ›  golang RSA秘钥的解析方式总结_go rsa公私钥 有效期_yuchenfw的博客
golang base64 rsa
https://blog.csdn.net/xz_studying/article/details/105778818
近视的火龙果
2 年前
    • 前言
    • 解析方式
      • 1. 字符串格式
        • (1)公钥
        • (2)私钥
      • 2. 证书文件格式
        • (1).pem、.cert、.cer、.crt
        • (2).pkcs12、.pfx、.p12
      • 3. N,E参数

      加密、解密、签名、验签等操作总少不了对秘钥的处理,秘钥的存储格式决定了解析方式。在 golang中关于RSA加密、解密、签名、验签的总结 一文中提到的仅是针对的字符串类型的秘钥处理,本文中将对常见的几种RSA秘钥存储格式及解析方式做个总结。

      常见的几种秘钥存储格式有:字符串、证书文件、n/e参数等,以下介绍具体格式的解析处理。

      1. 字符串格式

      这是最常见的一种形式,通常RSA的秘钥都是以hex、base64编码后的字符串提供,如证书内的秘钥格式即是base64编码的字符串,然后添加前后的具体标识实现的。可以通过解码字符串,构建公钥/私钥。

      注意:base64存在几种细节不同的编码格式,StdEncoding、URLEncoding、RawStdEncoding、RawURLEncoding,使用时还需要进一步确认秘钥具体编码格式,避免解码出错。以下未特殊说明的例子中均默认使用StdEncoding。

      (1)公钥

      直接hex、base64解码后调用x509.ParsePKIXPublicKey即可。

      key, _ := hex.DecodeString(publicKeyStr)
      publicKey, _ := x509.ParsePKIXPublicKey(key)
      

      (2)私钥

      由于RSA私钥存在PKCS1和PKCS8两种格式,因此解码后需要根据格式类型调用对应的方法即可。一般java使用pkcs8格式的私钥,其他语言使用pkcs1格式的私钥。使用时,记得确认下格式。

      //解析pkcs1格式私钥
      key, _ := base64.StdEncoding.DecodeString(pkcs1keyStr)
      privateKey, _ := x509.ParsePKCS1PrivateKey(key)
      //解析pkcs8格式私钥
      key, _ := hex.DecodeString(pkcs8keyStr)
      privateKey, err := x509.ParsePKCS8PrivateKey(key)
      

      2. 证书文件格式

      (1).pem、.cert、.cer、.crt

      .pem、.cert、.cer、.crt等都是pem格式的文件,只是文件后缀不一。

      PEM是Privacy Enhance Mail的缩写,PEM实质上是Base64编码的二进制内容(即对字符串格式私钥的文件化处理),再加上开始和结束行。

      解析方式:读取文件,调用pem.Decode,然后按照base64解码,再解析成公钥/私钥。

      key,_ := ioutil.ReadFile("pem_file_path")
      block, _ := pem.Decode(key)
      //解析成pkcs8格式私钥
      privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
      //解析成pkcs1格式私钥
      privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
      //解析成公钥
      publicKey, _ := x509.ParsePKIXPublicKey(key)
      

      (2).pkcs12、.pfx、.p12

      .pkcs12、.pfx、.p12这些文件格式存储的是已加密后的内容,可以通过openssl转换成pem文件后进行处理。

      提取密钥对:

      openssl pkcs12 -in in.p12 -out out.pem -nodes

      3. N,E参数

      这种就是比较特殊的。

      例如:login with apple keys的公钥就是这种格式的,需要根据n,e构造出公钥。

      "kty": "RSA", "kid": "eXaunmL", "use": "sig", "alg": "RS256", "n": "4dGQ7bQK8LgILOdLsYzfZjkEAoQeVC_aqyc8GC6RX7dq_KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdDNq1n52TpxQwI2EqxSk7I9fKPKhRt4F8-2yETlYvye-2s6NeWJim0KBtOVrk0gWvEDgd6WOqJl_yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X-Tip84wqwyRpUlq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll-p_Dg8vAXxJLIJ4SNLcqgFeZe4OfHLgdzMvxXZJnPp_VgmkcpUdRotazKZumj6dBPcXI_XID4Z4Z3OM1KrZPJNdUhxw", "e": "AQAB"

      使用时就需要,将N,E解析成big.Int格式,注意N、E的base64的具体编码格式:

      pubN, _ := parse2bigInt(n)
      pubE, _ := parse2bigInt(e)
      pub = &rsa.PublicKey{
          N: pubN,
          E: int(pubE.Int64()),
      // parse string to big.Int
      func parse2bigInt(s string) (bi *big.Int, err error) {
          bi = &big.Int{}
          b, err := base64.RawURLEncoding.DecodeString(s)//此处使用的是RawURLEncoding
          if err != nil {
              return
          bi.SetBytes(b)
          return
      

      以上是常见的几种密钥格式的解析方式,除了最后一种的指向性比较明确外,其他的解析方式还可以用于其他加密方式,因为说到底这些解析方式对应的就是秘钥存储的方式。

      文章目录前言解析方式1. 字符串格式(1)公钥(2)私钥2. 证书文件格式(1).pem、.cert、.cer、.crt(2).pkcs12、.pfx、.p123. N,E参数总结前言加密、解密、签名、验签等操作总少不了对秘钥的处理,秘钥的存储格式决定了解析方式。在golang中关于RSA加密、解密、签名、验签的总结一文中提到的仅是针对的字符串类型的秘钥处理,本文中将对常见的几种RSA秘钥存... 1.服务RSA密钥对可以放到缓存中,设置有效期; 2.注意公钥和私钥是配套使用的,公钥加密,私钥解密;私钥不正确的时候,最好同时处理公钥和私钥; 3.私钥不能直接通过明文的方式传输,可先存储起来,再生成唯一标识,将唯一标识和私钥映射起来;后续通过唯一标识找到对应私钥; urlencode:编码 URL 字符串,返回字符串,此字符串中除了-_.之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。 rawurldecode与urlencode同样用于编码URL字符串,区别在于rawurldecode会将空格则编码为“%20” 2、PHP语言中对URL的编码和解码 在PHP中使用rawurlencode和r...
      一、RSA算法概述 RSA是"非对称加密算法",非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公钥与私钥是配对的,用公钥加密的数据只有配对的私钥才能解密,反之亦然。因加解密使用两个不同的密钥,所以这种算法叫作非对称加密算法。 使用RSA加密算法流程如下: 1.消息接收方B先把公钥广播,消息发送方A保存B的公钥 2.当A需要向B发送消息时,先用B的公...
      #在证书文件目录下执行下面命令 查询名称为 cer格式的文件,取 name 属性值作为 openssl命令的参数 find ./ -name "*.cer" |xargs -i openssl x509 -in {} -noout -dates #如果证书文件少,可以直接查看这个证书的时间: openssl x509 -in acp_prod_verify.cer -noout -dates 查看私钥证书的过期时间: 我们可以先从私钥证书中提取出公钥证书,然后查看公钥证书的过期时间 # 从pf.
      name相同为一组复选框实现单选 在百度上找了但是没有发现合适的 都是单组或者少name相同的复选框实现单选 每次都要单独绑定通用性不高,后面自己动手写了 代码比较多 应该有更简洁的实现 1.第一版但是有Bug <!DOCTYPE HTML> <title>一组name相同的checkbox设置只能单选</t...
      在 Golang 中,可以使用第三方库来解析 pcap 文件,例如 GoPacket 和 gopacket/pcap。这里以 gopacket/pcap 为例,介绍如何使用 Golang 解析 pcap 文件。 首先,需要使用 go get 命令安装 gopacket/pcap 库: go get github.com/google/gopacket/pcap 接下来,可以使用以下示例代码来读取和解析 pcap 文件: ```go package main import ( "fmt" "log" "github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/google/gopacket/pcap" func main() { // 打开 pcap 文件 handle, err := pcap.OpenOffline("test.pcap") if err != nil { log.Fatal(err) defer handle.Close() // 循环读取数据包 packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) for packet := range packetSource.Packets() { // 解析以太网帧 ethernetLayer := packet.Layer(layers.LayerTypeEthernet) if ethernetLayer == nil { fmt.Println("Not an Ethernet frame") continue // 解析 IP 数据包 ipLayer := packet.Layer(layers.LayerTypeIPv4) if ipLayer == nil { fmt.Println("Not an IPv4 packet") continue // 解析 TCP 数据包 tcpLayer := packet.Layer(layers.LayerTypeTCP) if tcpLayer == nil { fmt.Println("Not a TCP packet") continue // 获取 TCP 数据 tcpPacket, _ := tcpLayer.(*layers.TCP) payload := tcpPacket.Payload // 处理 TCP 数据 fmt.Printf("TCP Payload: %s\n", string(payload)) 这个示例代码可以打开一个名为 "test.pcap" 的 pcap 文件,并循环读取其中的数据包。对于每个数据包,它会先解析以太网帧、IP 数据包和 TCP 数据包,然后获取 TCP 数据并进行处理。 需要注意的是,这个示例代码仅适用于 TCP 数据包,并且假定 TCP 数据是 ASCII 编码的文本数据。如果需要处理其他类型的数据包或二进制数据,需要进行相应的修改。
 
推荐文章
风度翩翩的创口贴  ·  《同人片子的网站入口》原神vicineko同人胡桃史莱姆在哪里看_神马影院在线手机观看韩国电影_影视星梦剧场 - 国际中文教师丨尊享班 - 嗨邻国--ICATEST国际汉语教师实训平台官网 - 创新中
7 月前
闯红灯的大熊猫  ·  faster to re-load data or preserve/restore? - Statalist
7 月前
考研的麦片  ·  杭州市临安区吴越国衣锦城考古遗址公园管理局2025年度公开招聘编外聘用人员的公告
8 月前
奔跑的茄子  ·  发展氢能产业,白云凭什么?-广州市白云区人民政府门户网站
8 月前
挂过科的杯子  ·  湖南省高级人民法院柏广衡等4名同志任前公示_选举任免_湖南人大网
9 月前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号