使用危险品库加载原始公共EC密钥



我使用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转换为字节。

您混淆了两种格式,一种是原始公钥,另一种是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格式导出,并且DER编码在NodeJS代码中。这可以实现,例如使用

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

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

最新更新