【问题标题】:How to find ASN.1 components of EC key python-cryptography如何找到 EC 密钥 python-cryptography 的 ASN.1 组件
【发布时间】:2017-01-31 08:30:29
【问题描述】:

我正在以这种方式使用 python 加密模块生成 EC 密钥

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

EC key的asn.1结构如下

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

来自https://www.rfc-editor.org/rfc/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 参数都是整数。

提前谢谢你

【问题讨论】:

    标签: python cryptography openssh python-cryptography


    【解决方案1】:

    使用pyasn1 从 ASN.1 序列中提取公共点相对容易,但如果您想要 PEM 加密的 PKCS1(又名“传统 OpenSSL”),那么 pyca/cryptography 可以很容易地做到这一点:

    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进行加密。

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 2013-03-11
      • 1970-01-01
      • 2017-03-02
      • 2011-08-23
      相关资源
      最近更新 更多