2016-09-22 20 views
5

我使用Python的加密模塊,以這種方式產生EC關鍵的ASN.1組件如何找到關鍵EC的python-加密

from cryptography.hazmat.backends import default_backend 
from cryptography.hazmat.primitives.asymmetric import ec 
key=ec.generate_private_key(ec.SECP256R1(), default_backend()) 

EC密鑰的ASN.1結構如下

ECPrivateKey ::= SEQUENCE { 
version  INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), 
privateKey  OCTET STRING, 
parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, 
publicKey [1] BIT STRING OPTIONAL 
} 

https://tools.ietf.org/html/rfc5915相間螺旋纏繞製成3

我的問題是如何從這個鍵獲取ASN.1組件。我想重點對象轉換爲OpenSSH的私鑰,像

-----BEGIN EC PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: AES-128-CBC,9549ED842979FDAF5299BD7B0E25B384 

Z+B7I6jfgC9C03Kcq9rbWKo88mA5+YqxSFpnfRG4wkm2eseWBny62ax9Y1izGPvb 
J7gn2eBjEph9xobNewgPfW6/3ZDw9VGeaBAYRkSolNRadyN2Su6OaT9a2gKiVQi+ 
mqFeJmxsLyvew9XPkZqQIjML1d1M3T3oSA32zYX21UY= 
-----END EC PRIVATE KEY----- 

這是很容易與處理DSA或RSA,因爲所有的ASN.1參數在該整數。

預先感謝您

回答

0

這是比較容易提取使用pyasn1的ASN.1序列的公共點,但如果你想PEM加密PKCS1(又名「傳統的OpenSSL」),那麼的pycA /密碼可以做這很容易:

from cryptography.hazmat.backends import default_backend 
from cryptography.hazmat.primitives import serialization 
from cryptography.hazmat.primitives.asymmetric import ec 

backend = default_backend() 

key = ec.generate_private_key(ec.SECP256R1(), backend) 
serialized_key = key.private_bytes(
    serialization.Encoding.PEM, 
    serialization.PrivateFormat.TraditionalOpenSSL, 
    serialization.BestAvailableEncryption(b"my_great_password") 
) 

您可以找到有關在文檔中private_bytes方法的詳細信息。此時BestAvailableEncryption將使用AES-256-CBC進行加密。