目录
一、ECC Public Key生成(基于python实现)
三、读取的ECC public key进行Base64 解码
一、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)
参考文章: