我做私人和公共密鑰文件作爲(二郎)遇到錯誤而解析ecsda公鑰PEM文件
openssl ecparam -name secp256k1 -genkey -out gen.pem
openssl ec -in gen.pem -pubout -out gen.pub
然後我檢查.pub文件
openssl pkey -in gen.pub -pubin -text -noout
Public-Key: (256 bit)
pub:
04:fc:de:4f:2a:77:bd:c4:f2:74:2b:ba:b5:fc:85:
e4:aa:96:a7:8e:86:14:bc:0d:fa:8e:d2:dd:50:3c:
5d:fa:f4:07:f4:17:80:49:06:19:0c:72:03:63:4e:
07:37:e9:10:64:c8:33:a4:a3:7e:26:d8:df:79:21:
d7:2d:a6:01:80
ASN1 OID: secp256k1
即開始ERL後
erl
Erlang/OTP 18 [erts-7.2] [source-e6dd627] [64-bit] [smp:3:3] [async-threads:10] [hipe] [kernel-poll:false]
執行命令後
1>rr(public_key),
{ok,RawData} = file:read_file("gen.pub"),
Decoded = public_key:pem_decode(RawData),
[public_key:pem_entry_decode(X) || X <- Decoded ].
我得到異常
** exception error: no match of right hand side value
{error,{asn1,{invalid_length,1}}}
in function public_key:der_decode/2 (public_key.erl, line 229)
我知道有解決方法,但我想知道如果我做錯事或有在公共密鑰模塊錯誤?
UPD 1.
當我們看結果
{ok,#'SubjectPublicKeyInfo'{algorithm = #'AlgorithmIdentifier'{algorithm = {1,2,840,10045,2,1},
parameters = <<6,5,43,129,4,0,10>>},
subjectPublicKey = <<4,241,200,19,168,25,25,81,43,216,
89,201,37,62,66,39,166,231,161,98,
223,133,119,12,...>>}}
我們可以看下:
{} 1,2,840,10045,2,1是OID的ecPublicKey http://oid-info.com/get/1.2.840.10045.2.1
參數= < < 6,5,43,129,4,0,10 >>
'OTP-PUB-KEY':decode('EcpkParameters',<<6,5,43,129,4,0,10>>).
給我們
{ok,{namedCurve,{1,3,132,0,10}}}
和
pubkey_cert_records:namedCurves({1,3,132,0,10}).
賦予我們源曲線 - secp256k1和
subjectPublicKey = <<4,241,200,19,168,25,25,81,43,216,
89,201,37,62,66,39,166,231,161,98,
223,133,119,12,...>>
是公共密鑰本身。但這是我之前說過的解決方法。
代替你錯過了由OP所示的最後一步,這對於你的情況你可以通過public_key:pem_entry_decode(hd(Dec))來運行。如果你在'gen.pub'上運行它,你會得到和OP一樣的錯誤。 –
好的,謝謝你指出。我將添加一個編輯。 – Amiramix
所以我覺得這不是一個功能這是一個錯誤 – DimaSUN