2016-02-28 63 views
1

我做私人和公共密鑰文件作爲(二郎)遇到錯誤而解析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,...>> 

是公共密鑰本身。但這是我之前說過的解決方法。

回答

1

我想你的步驟,它的工作對我馬上:

[email protected]:~/test % openssl ecparam -name secp256k1 -genkey -out gen.pem 

[email protected]:~/test % openssl ec -in gen.pem -pubout -out gen.pub 
read EC key 
writing EC key 

[email protected]:~/test % openssl pkey -in gen.pub -pubin -text -noout 
Public-Key: (256 bit) 
pub: 
    04:f1:c8:13:a8:19:19:51:2b:d8:59:c9:25:3e:42: 
    27:a6:e7:a1:62:df:85:77:0c:ef:f7:0e:0e:19:93: 
    df:e6:f5:42:66:7e:ee:02:07:76:85:19:a4:a8:2d: 
    03:11:73:0c:b2:d4:4c:c7:0e:42:d3:30:b5:51:e3: 
    97:45:f8:b5:6a 
ASN1 OID: secp256k1 

[email protected]:~/test % erl 
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] 

Eshell V7.2.1 (abort with ^G) 

1> rr(public_key). 
['AAControls','ACClearAttrs','AccessDescription', 
'Algorithm','AlgorithmIdentifier', 
'AlgorithmIdentifierPKCS-10','AlgorithmIdentifierPKCS-8', 
'AlgorithmIdentifierPKCS5v2-0','AlgorithmIdentifierPKSC-7', 
'AlgorithmNull','AnotherName','AttCertValidityPeriod', 
'Attribute','AttributeCertificate', 
'AttributeCertificateInfo','AttributePKCS-10', 
'AttributePKCS-7','AttributeTypeAndValue', 
'Attributes_SETOF', 
'Attributes_SETOF_valuesWithContext_SETOF', 
'AuthorityKeyIdentifier','BasicConstraints', 
'BuiltInDomainDefinedAttribute','BuiltInStandardAttributes', 
'Certificate','CertificateList','CertificationRequest', 
'CertificationRequestInfo', 
'CertificationRequestInfo_attributes_SETOF'|...] 

2> {ok,Data}=file:read_file("gen.pub"). 
{ok,<<"-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8cgTqBkZUSvYWcklPkInpuehYt+Fdwzv\n9w4OGZPf5vVCZn7u"...>>} 

3> Dec=public_key:pem_decode(Data). 
[#'SubjectPublicKeyInfo'{algorithm = <<48,86,48,16,6,7,42, 
             134,72,206,61,2,1, 
             6,5,43,129,4,0,10, 
             3,66,0,4,241,200, 
             ...>>, 
         subjectPublicKey = not_encrypted}] 

我OpenSSL的版本:

[email protected]:~/test % openssl version 
OpenSSL 1.0.1p-freebsd 9 Jul 2015 

系統是FreeBSD 10.2-RELEASE。 Erlang版本在上面的shell輸出中。該gen.pub關鍵,它爲我生成的(如果你想嘗試加載它)是:

[email protected]:~/test % cat gen.pub 
-----BEGIN PUBLIC KEY----- 
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8cgTqBkZUSvYWcklPkInpuehYt+Fdwzv 
9w4OGZPf5vVCZn7uAgd2hRmkqC0DEXMMstRMxw5C0zC1UeOXRfi1ag== 
-----END PUBLIC KEY----- 

你也許要粘貼鍵,這樣我可以嘗試加載它?

編輯:

對不起,我錯過了最後一步。這似乎是OTP代碼中的一個錯誤。der_decode/2函數調用KeyType設置爲ECPoint,請參閱pem_entry_decode/1 function。但是der_decode/2 expects Asn1Type。調用'OTP-PUB-KEY'模塊直接似乎工作:

8> Bin = hd(Dec)#'SubjectPublicKeyInfo'.algorithm. 
32> 'OTP-PUB-KEY':decode('SubjectPublicKeyInfo', Bin). 
{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,...>>}} 

但是我不知道這是否會返回任何明智的。也許值得提出一個在OTP中的bug,將你在這個問題中發佈的代碼作爲重現的步驟。那麼至少有人能勝任驗證爲什麼它不起作用。我相信你所遵循的步驟都很好,並且返回並傳遞給其他函數的類型在the documentation方面是可以的。

+0

代替你錯過了由OP所示的最後一步,這對於你的情況你可以通過public_key:pem_entry_decode(hd(Dec))來運行。如果你在'gen.pub'上運行它,你會得到和OP一樣的錯誤。 –

+0

好的,謝謝你指出。我將添加一個編輯。 – Amiramix

+0

所以我覺得這不是一個功能這是一個錯誤 – DimaSUN

0

我發現,在public_key.erl線(線136-137)

'ECPoint' -> 
    der_decode(KeyType, Key0) 

必須與

'ECPoint' -> 
    {{KeyType,Key0},der_decode('EcpkParameters', Params)}