我正在try 仅从私钥重新创建P-521 JWK.

根据第spec条(第4.2.1节):

"x成员包含椭圆曲线点的x坐标. 它表示为坐标的BIG的Base64url编码 端序表示法."

我try 过对私钥进行Base64url解码,并将其与P-521基点进行标量相乘,以获得公钥点.然后,我try 将x和y坐标转换为大端八位字节表示法,并将其编码回base 64url格式.结果与JWK中原始的x和y Base64url编码字段不匹配.

我也try 过P-256曲线,但也不起作用.

const elliptic = require('elliptic');
const EC = elliptic.ec;
const {base16, base64url} = require('rfc4648');
const BN = require("bn.js");
const padBase16ToWholeOctets = s => s.length%2===0 ? s : '0'+s;
const bnToB64 = n => base64url.stringify(base16.parse(padBase16ToWholeOctets(n.toString(16))))

console.log('begin'); // forces console output to show from async IIFE

(async () => {
  let keyPair = await crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-521" }, true, ['sign'])
  let jwk = await crypto.subtle.exportKey("jwk", keyPair.privateKey)
  console.log(jwk)

  const dHex = base16.stringify(base64url.parse(jwk.d, { loose: true }))

  const ec = new EC('p521')
  const [x,y] = ec.curve.g.mul(new BN(dHex, 16, 'be')).toJSON()

  console.log(`expected x: ` + jwk.x)
  console.log(`actual   x: ` + bnToB64(x))

  console.log(`expected y: ` + jwk.y)
  console.log(`actual   y: ` + bnToB64(y))

})();

推荐答案

WebCrypto接口生成的数据是正确的.您的数据差异是由计算过程中的两个问题造成的:

  • X和y未规格化,请参见getX()getY().
  • X和y不填充为66字节(具有前导0x00字节).

第一个问题可以通过以下方式解决:

const point = ec.curve.g.mul(new BN(dHex, 16, 'be'))
console.log(`actual   x: ` + bnToB64(point.getX()))
console.log(`actual   y: ` + bnToB64(point.getY()))

第二个是:

const bnToB64 = n => base64url.stringify(base16.parse(padBase16ToWholeOctets(n.toString(16)).padStart(132, '0')))

Javascript相关问答推荐

VMWHTMLWebMKS-控制台连接良好,但没有屏幕且占用率高

json日期格式为2001年9月10日T21:00:00.000 Z

如何计算数组子级的深度- Vue.js

Vue:ref不会创建react 性属性

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

Rehype将hashtag呈现为URL

PrivateRoute不是路由组件错误

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

单击ImageListItemBar的IconButton后,在Material—UI对话框中显示图像

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

在服务器上放置了Create Reaction App Build之后的空白页面

空的结果抓取网站与Fetch和Cheerio

使用Google API无法进行Web抓取

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

在Java中寻找三次Bezier曲线上的点及其Angular

使用VUE和SCSS的数字滚动动画(&;内容生成)

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

try 将Redux工具包与MUI ToggleButtonGroup组件一起使用时出错

背景动画让网站摇摇欲坠

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';