ECDSA签名-从ASN 1中提取R|S.格式



我正试图从ASN 1中的ECDSA中精确计算r、s和v。总体安排

有了这三个参数,我正计划从签名中计算公钥。

我的签名是73字节长。如何提取r、s和?哪些字节是前缀?

这是我的签名:

304502204C3AB9B1860008F0727D4208D55D21778D765A2F7DD005409F6DA6D088DDBD0A02210097FED70019662BAD8196480DD0D9DBDFD96137D19E31BA933E80F1A12BBFF41D

到目前为止,我读到前两个字节3045是前缀,这让我仍然有71个字节

您可以使用自己掌握的任何ASN.1解析器,也可以自己编写解析器。一个简单的Ruby代码片段可以很好地完成这项工作:

require 'openssl'
der = "304502204C3AB9B1860008F0727D4208D55D21778D765A2F7DD005409F6DA6D088DDBD0A02210097FED70019662BAD8196480DD0D9DBDFD96137D19E31BA933E80F1A12BBFF41D".scan(/../).map { |x| x.hex.chr }.join
asn1 = OpenSSL::ASN1.decode(der)
r,s = asn1.value
puts "r: #{r.value}ns: #{s.value}"

该输出:

r: 34479535231181969595855089292034272330749384807106277743970674769427519356170
s: 68749503168666332080677992907050713241533227486157775318500627956188309353501

在bash或兼容shell上执行的以下OpenSSL命令也可以执行此任务。这不需要额外的口译员。sig.bin包含DER格式的签名。根据您的需要进行调整,例如echo ... | xxd -r -ps > sig.bin可以将十六进制转换为二进制。

r=$(openssl asn1parse -in sig.bin -inform DER | sed -n 2p | sed -n 's/.*INTEGER.*:(.*)/1/p')
s=$(openssl asn1parse -in sig.bin -inform DER | sed -n 3p | sed -n 's/.*INTEGER.*:(.*)/1/p')
echo $r$s

最新更新