0

我正在尝试使用 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"
}

任何帮助是极大的赞赏。

4

1 回答 1

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);
});
于 2019-05-26T13:10:01.727 回答