【问题标题】:Load Raw Public EC Key using hazmat library使用危险品库加载原始公共 EC 密钥
【发布时间】:2021-07-17 02:28:22
【问题描述】:

我有以下使用 JS 生成的私钥和公钥:

priv: auLHORUBmv5n48jUDA1TskAmJWFi4TFEmjE1GjgjEB8
pub : BFvn-Qk8HWPwgI5ZgCiWxJV5SYdTXbkVz66sgoEslLxotftRGLEOeIPXVcnQD95eETqW9zM7ejB1MqCc0tvR-0g

要生成的代码(JavaScript):

const pair = generateKeyPairSync('ec', { namedCurve: 'prime256v1' })
const privateKeyDer = pair.privateKey.export({ format: 'der', type: 'pkcs8' })
const privateRaw = privateKeyDer.slice(36, 68)
const publicRaw = privateKeyDer.slice(73)
console.log(`priv: ${webSafe64(privateRaw)}`)
console.log(`pub : ${webSafe64(publicRaw)}`)

现在,我的 Python 项目需要使用 cryptography.hazmat.primitives.serialization.load_der_public_key() 加载公钥

load_der_public_key(base64.b64decode(publicRaw))

我似乎不知道该怎么做。不断报错:

Could not deserialize key data. The data may be in an incorrect format or it may be encrypted with an unsupported algorithm.

试图将该字符串转换为字节,并将base64转换为字节,但没有任何运气。

【问题讨论】:

    标签: python encryption public-key-encryption elliptic-curve


    【解决方案1】:

    您混淆了两种格式,一种是原始公钥,另一种是X.509/SPKI格式的DER编码公钥。

    发布的公钥:

    BFvn-Qk8HWPwgI5ZgCiWxJV5SYdTXbkVz66sgoEslLxotftRGLEOeIPXVcnQD95eETqW9zM7ejB1MqCc0tvR-0g
    

    是 Base64url 编码的原始公钥。十六进制编码格式为 0x04 + x + y,secp256r1(又名 prime256v1)的大小为 65 个字节:

    045be7f9093c1d63f0808e59802896c495794987535db915cfaeac82812c94bc68b5fb5118b10e7883d755c9d00fde5e113a96f7333b7a307532a09cd2dbd1fb48
    

    在 Python 中,可以使用 Cryptography 库的from_encoded_point() 导入原始公钥,例如:

    from cryptography.hazmat.primitives.asymmetric import ec
    import base64
    
    curve = ec.SECP256R1()
    publicKeyRaw = base64.urlsafe_b64decode('BFvn-Qk8HWPwgI5ZgCiWxJV5SYdTXbkVz66sgoEslLxotftRGLEOeIPXVcnQD95eETqW9zM7ejB1MqCc0tvR-0g=');
    publicKey = ec.EllipticCurvePublicKey.from_encoded_point(curve, publicKeyRaw);
    

    但是,对于使用 load_der_public_key() 的导入,密钥必须以 X.509/SPKI 格式导出,并在 NodeJS 代码中编码 DER。这可以实现,例如与

    var publicKeyDer = pair.publicKey.export({ format: 'der', type: 'spki' })
    

    当然,也可以在两种格式之间进行转换。但由于 Cryptography 库支持两种格式的导入,这实际上是没有必要的。

    【讨论】:

    • 感谢您提供非常好的答案。是的,也许我有点困惑。问题是这就是我从服务器获得的所有信息,公共原始密钥。现在一切都很好!
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多