我有以下私钥和公钥生成w/ 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转换为字节而没有任何运气。
发布于 2021-04-22 22:54:49
您混淆了两种格式,一种是原始公钥,另一种是X.509/SPKI格式的DER编码公钥。
已张贴的公钥:
BFvn-Qk8HWPwgI5ZgCiWxJV5SYdTXbkVz66sgoEslLxotftRGLEOeIPXVcnQD95eETqW9zM7ejB1MqCc0tvR-0g
是Base64url编码的原始公钥。十六进制编码它的格式为0x04 +x+y,secp256r1 (又名prime256v1)的大小为65个字节:
045be7f9093c1d63f0808e59802896c495794987535db915cfaeac82812c94bc68b5fb5118b10e7883d755c9d00fde5e113a96f7333b7a307532a09cd2dbd1fb48
在Python中,可以使用密码库的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' })
当然,也可以在这两种格式之间进行转换。但是,由于密码库支持这两种格式的导入,这实际上是不必要的。
https://stackoverflow.com/questions/67220489
复制相似问题