首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用危险货物库加载原始公共电子商务密钥

使用危险货物库加载原始公共电子商务密钥
EN

Stack Overflow用户
提问于 2021-04-22 20:42:10
回答 1查看 486关注 0票数 2

我有以下私钥和公钥生成w/ JS:

代码语言:javascript
运行
复制
priv: auLHORUBmv5n48jUDA1TskAmJWFi4TFEmjE1GjgjEB8
pub : BFvn-Qk8HWPwgI5ZgCiWxJV5SYdTXbkVz66sgoEslLxotftRGLEOeIPXVcnQD95eETqW9zM7ejB1MqCc0tvR-0g

要生成的代码(JavaScript):

代码语言: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()加载公钥。

代码语言:javascript
运行
复制
load_der_public_key(base64.b64decode(publicRaw))

我好像想不出该怎么做。不断出错:

代码语言:javascript
运行
复制
Could not deserialize key data. The data may be in an incorrect format or it may be encrypted with an unsupported algorithm.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-22 22:54:49

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

已张贴的公钥:

代码语言:javascript
运行
复制
BFvn-Qk8HWPwgI5ZgCiWxJV5SYdTXbkVz66sgoEslLxotftRGLEOeIPXVcnQD95eETqW9zM7ejB1MqCc0tvR-0g

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

代码语言:javascript
运行
复制
045be7f9093c1d63f0808e59802896c495794987535db915cfaeac82812c94bc68b5fb5118b10e7883d755c9d00fde5e113a96f7333b7a307532a09cd2dbd1fb48

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

代码语言:javascript
运行
复制
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格式导出密钥。这是可以实现的,例如

代码语言:javascript
运行
复制
var publicKeyDer = pair.publicKey.export({ format: 'der', type: 'spki' })

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67220489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档