ECC public key pem格式生成及ECPoint:X,Y格式转换

目录

一、ECC Public Key生成(基于python实现)

二、使用openssl读取ECC public key

三、读取的ECC public key进行Base64 解码

四、对ECC public key 进行逐层解析


一、ECC Public Key生成(基于python实现)

import ecdsa
import hashlib
from ecdsa.util import sigencode_der,sigdecode_der
ecc_pri = ecdsa.SigningKey.generate(curve=ecdsa.NIST256p)
#print(ecc_pri.to_pem())

sign_dat = ecc_pri.sign(b'123456', entropy=None, hashfunc=hashlib.sha256, sigencode=sigencode_der)
print(sign_dat)

ecc_pub = ecc_pri.get_verifying_key()
result = ecc_pub.verify(sign_dat, b'123456', hashfunc=hashlib.sha256, sigdecode=sigdecode_der)
print(result) #验证成功返回True

with open('ecc_sig.data','wb') as f1:
    f1.write(sign_dat)
    
with open('ecc_pub.pem','wb') as f2:
    f2.write(ecc_pub.to_pem())
    
with open('ecc_pri.pem','wb') as f3:
    f3.write(ecc_pri.to_pem())

二、使用openssl读取ECC public key

三、读取的ECC public key进行Base64 解码

四、对ECC public key 进行逐层解析

我们以一个DER编码的ECC公钥为例,详细剖析一下X.509 ECC公钥的格式。公钥内容如下:

0x30 0x59 0x30 0x13 0x06 0x07 
0x2a 0x86 0x48 0xce 0x3d 0x02 
0x01 0x06 0x08 0x2a 0x86 0x48 
0xce 0x3d 0x03 0x01 0x07 0x03 
0x42 0x00 0x04 0x13 0x32 0x8e 
0x0c 0x11 0x8a 0x70 0x1a 0x9e 
0x18 0xa3 0xa9 0xa5 0x65 0xd8 
0x41 0x68 0xce 0x2f 0x5b 0x11 
0x94 0x57 0xec 0xe3 0x67 0x76 
0x4a 0x3f 0xb9 0xec 0xd1 0x15 
0xd0 0xf9 0x56 0x8b 0x15 0xe6 
0x06 0x2d 0x72 0xa9 0x45 0x56 
0x99 0xb0 0x9b 0xb5 0x30 0x90 
0x8d 0x2e 0x31 0x0e 0x95 0x68 
0xcc 0xcc 0x19 0x5c 0x65 0x53 
0xba

通过前面的介绍,我们已经知道这是一个ASN.1格式的SubjectPublicKeyInfo的DER编码,是一个TLV类型的二进制数据。现在我们逐层解析下:

0x30 (SEQUENCE TAG: SubjectPublicKeyInfo) 0x59 (SEQUENCE LEN=89)
        0x30 (SEQUENCE TAG: AlgorithmIdentifier) 0x13 (SEQUENCE LEN=19)
                0x06 (OID TAG: Algorithm) 0x07 (OID LEN=7)
                        0x2a 0x86 0x48 0xce 0x3d 0x02 0x01 (OID VALUE="1.2.840.10045.2.1": ecPublicKey/Unrestricted Algorithm Identifier)
                0x06 (OID TAG: ECParameters:NamedCurve) 0x08 (OID LEN=8)
                        0x2a 0x86 0x48 0xce 0x3d 0x03 0x01 0x07 (OID VALUE="1.2.840.10045.3.1.7": Secp256r1/prime256v1)
        0x03 (BIT STRING TAG: SubjectPublicKey:ECPoint) 0x42 (BIT STRING LEN=66) 0x00 (填充bit数量为0)
                0x04 (未压缩的ECPoint)
                0x13 0x32 0x8e 0x0c 0x11 0x8a 0x70 0x1a 0x9e 0x18 0xa3 0xa9 0xa5 0x65 0xd8 0x41 0x68 0xce 0x2f 0x5b 0x11 0x94 0x57 0xec 0xe3 0x67 0x76 0x4a 0x3f 0xb9 0xec 0xd1 (ECPoint:X)
                0x15 0xd0 0xf9 0x56 0x8b 0x15 0xe6 0x06 0x2d 0x72 0xa9 0x45 0x56 0x99 0xb0 0x9b 0xb5 0x30 0x90 0x8d 0x2e 0x31 0x0e 0x95 0x68 0xcc 0xcc 0x19 0x5c 0x65 0x53 0xba (ECPoint:Y)

参考文章:

ECC公钥格式详解-CSDN博客

数字签名验签 — ECC算法_ecc签名-CSDN博客

https://www.cnblogs.com/xinzhao/p/8963724.html

在线Base64解码-Base64在线解密

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值