我正在尝试使用Web Crypto API函数importKey导入Base64 PublicKey。目的是创建一个简单的模式来解析PublicKey并启用密码加密。
我尝试使用importKey函数的“原始”方法将PublicKey作为Uint8Array导入-参见以下脚本:
import buffer from 'buffer'
let kpub = "U6uvqoxXGj17tFS5C05tSWohDQl2u1ugiHyNKXB9WF0UiYaxa5FxiLX/LxGeDUPMyLmWBGBUjpTzh1owF9RWug=="
let buff = new Buffer(kpub, 'base64');
window.crypto.subtle.importKey(
"raw",
buff,
{
name: "ECDH",
namedCurve: "P-256",
},
false,
[]
)
.then(function(publicKey){
console.log(publicKey);
})
.catch(function(err){
console.error(err);
});
我希望这会产生输入的输入版本kpub。但是,输出未在控制台中显示-启用错误处理后,我得到了DOMException。
知道我做错了什么吗?
作为替代方案,将publicKey转换为JWK格式可能会更容易。例如,我已经确认下面的JWK可以在importKey函数中正常工作。但是,如果要使用此功能,我将很难将输入的kpub转换为x和y坐标:
const jwkKey = {
"kty":"EC",
"crv":"P-256",
"x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
"y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
"kid":"Id that can be uniquely Identified"
}
非常感谢您的帮助。
答案 0 :(得分:0)
在德米特里·切斯特尼克(Dmitry Chestnykh)的帮助下,我通过在单个字节前面添加0x04使其起作用:
const device_kpub_base64 = "U6uvqoxXGj17tFS5C05tSWohDQl2u1ugiHyNKXB9WF0UiYaxa5FxiLX/LxGeDUPMyLmWBGBUjpTzh1owF9RWug=="
const prepend_byte = new Buffer([4])
let device_kpub_buffer = new Buffer(device_kpub_base64, 'base64');
device_kpub_buffer = Buffer.concat([prepend_byte, device_kpub_buffer])
// Import the device public key into the web crypto API
window.crypto.subtle.importKey(
"raw",
device_kpub_buffer,
{
name: "ECDH",
namedCurve: "P-256",
},
true,
[]
)
.then(function(devicePublicKey){
console.log(devicePublicKey);
})
.catch(function(err){
console.error(err);
});