我的目的是根据输入字符串创建相同的私钥/公钥:
尝试导入ECC私钥时遇到问题:
此私钥是从哈希创建的:
import sys
import base64
import string
from Crypto.PublicKey import ECC
from Crypto.Hash import SHA256
from Crypto.IO import PEM
input = sys.argv[1]
input_hash = SHA256.new(input)
private_pem = PEM.encode(input_hash.digest(), "PRIVATE KEY", passphrase=None, randfunc=None)
key = ECC.import_key(private_pem)
跟踪踪迹:
Traceback(最近一次调用最后一次):文件“request.py”,第29行,in key = ECC.import_key(private_pem)文件“C:\ Python27 \ lib \ site-packages \ Crypto \ PublicKey \ ECC.py”,第792行, import_key return _import_der(der_encoded,passphrase)文件“C:\ Python27 \ lib \ site-packages \ Crypto \ PublicKey \ ECC.py”,第725行,in _import_der 提高ValueError(“非ECC DER键”)ValueError:不是ECC DER键
有人对这个问题有所了解吗?
答案 0 :(得分:0)
关于如何编码密钥有标准。在剥离PEM编码提供的 ASCII armor 之后,似乎import_key
方法验证它是ASN.1 DER编码的。
PEM由页眉和页脚行组成,在本例中为泛型 PRIVATE KEY
标题。该行不表示密钥的类型。因此,它使用密钥的PKCS#8包装表示,其包含指示密钥类型的标识符。此PKCS#8已由ASN.1表示法指定,该表示法指示密钥和DER的结构,其指定了如何使用该结构对值进行编码。 PKCS#8也可以包装密钥,但是由于您没有指定密码,我认为它不是。
现在在PKCS#8内部应该有一个密钥本身的表示。对于ECC,通常使用X9.62。这又是密钥的ASN.1 / DER编码。它不包含私钥值。它还包含对所使用的ECC域参数的引用 - 或完整的域参数。如果使用您指定的方法,则必须自己创建此结构。如何编码结构在section 3 of RFC-5915。
中指定您似乎应该能够创建一个快捷方式,并且只提供RFC中指定的X9.62公钥import_key
(查看文档!)。在这种情况下,在页眉和页脚行中使用PRIVATE EC KEY
而不是PRIVATE KEY
。有关结构的更多信息,请参阅Thomas的答案 - 或者仅参考RFC。
您可能需要一个ASN.1或DER库,因为ASN.1编码/解码不适合心脏的弱点(并且是许多实现中的越界,缓冲区溢出和整数溢出错误的常见来源,否定大多数加密可以提供的安全性。)