国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

詳解Node.js 中使用 ECDSA 簽名遇到的坑

2024-05-06 15:27:44
字體:
供稿:網(wǎng)友

最近有個(gè)朋友問我關(guān)于 Node.js 下使用 ECDSA 的問題,主要是使用 Node.js 的 Crypto 模塊無法校驗(yàn)網(wǎng)絡(luò)傳輸過來的簽名結(jié)果。在踩坑無數(shù)后,終于搞清楚了原因。

坑 0x00:簽名輸出格式

在排除了證書、消息不一致的可能之后,我開始對(duì)比使用 Node.js 簽名的結(jié)果與網(wǎng)絡(luò)傳輸過來的簽名,發(fā)現(xiàn)長(zhǎng)度不一致,大約差了5~7個(gè)字節(jié)。于是去網(wǎng)上搜索了一下,才知道原來 Node.js (基于 OpenSSL)簽名得到的是 DER 格式的內(nèi)容,而網(wǎng)絡(luò)上常用的 ECDSA 簽名結(jié)果是 IEEE P1363 格式的。(也可以寫作 R|S)

參考:https://stackoverflow.com/a/39575576

知道問題了就好解決了。但是,DER 和 IEEE P1363 兩個(gè)格式互轉(zhuǎn)也不是那么容易的。

簡(jiǎn)單科普一下,ECDSA 是指基于 ECC 橢圓加密算法的簽名方式,簽名結(jié)果是兩個(gè)整數(shù) R 和 S。 R 和 S 一般長(zhǎng)度相同,或者接近。如果長(zhǎng)度不同,在各自前面補(bǔ)字節(jié) 0x00 直到等長(zhǎng)。把 R 和 S 以大頭字節(jié)序表示,然后依次前后拼接,就是所謂 IEEE P1363 格式。

坑 0x01:DER 的整數(shù)問題

先來了解一下 ECDSA 的 DER 輸出格式,大概如下:

SEQUENCE <LENGTH> INTEGER <INTEGER_LENGTH> <INTEGER_VALUE...> # 整數(shù) R INTEGER <INTEGER_LENGTH> <INTEGER_VALUE...> # 整數(shù) S

其中

SEQUENCE 是 DER 數(shù)組(串?)標(biāo)頭,用一個(gè)字節(jié) 0x30 表示

<LENGTH> 是 SEQUENCE 的長(zhǎng)度,用一個(gè)字節(jié)表示,不包括標(biāo)頭和這個(gè)長(zhǎng)度本身

INTEGER 是整數(shù)標(biāo)頭,用一個(gè)字節(jié) 0x02 表示

<INTEGER_LENGTH> 是整數(shù)的字節(jié)長(zhǎng)度,用一個(gè)字節(jié)表示。

<INTEGER_VALUE> 是整數(shù)的內(nèi)容,以大頭字節(jié)序表示。

另一個(gè)坑我也已經(jīng)寫出來了,不知道有人發(fā)現(xiàn)沒有?沒想到的話,繼續(xù)往下。

IEEE P1363 格式下,R 和 S 都是等長(zhǎng)的。所以只要把 IEEE P1363 格式的簽名從中間切分就可以得到 R 和 S 的內(nèi)容了。而且 IEEE P1363 格式下,R 和 S 也是以大頭字節(jié)序表示的,因此沒有字節(jié)序轉(zhuǎn)換問題了?,F(xiàn)在,只需要按上面的格式構(gòu)造一個(gè) DER 即可。

坑 0x01.0:缺少整數(shù)前置字節(jié) 0x00

我第一次嘗試將 IEEE P1363 格式的簽名轉(zhuǎn)換成 DER 格式,并沒有失敗,但是當(dāng)我換一個(gè)簽名結(jié)果,卻失敗了……我對(duì)比了 DER 和 IEEE P1363 的區(qū)別,發(fā)現(xiàn)了一個(gè)特點(diǎn),在 DER 格式下,R 和 S 偶爾會(huì)有前置字節(jié) 0x00,但不是一定的。

查資料后才明白,DER 下沒有“無符號(hào)整數(shù)”之說,也就是說整數(shù)都是有符號(hào)的。如果 INTEGER 所表示的整數(shù)最高字節(jié)大于 0x7F,也就是最高位(符號(hào)位)為 1,則表示負(fù)數(shù)。如果要表示正數(shù),必須在前面補(bǔ)一個(gè)字節(jié) 0x00……

參考 https://bitcointalk.org/index.php?topic=215205.msg2258789#msg2258789

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 南宁市| 石嘴山市| 太和县| 金沙县| 周至县| 亳州市| 社会| 北宁市| 鸡泽县| 武强县| 汝州市| 招远市| 上饶县| 靖安县| 集安市| 鄂温| 金川县| 罗源县| 博客| 藁城市| 临桂县| 龙陵县| 营山县| 山阴县| 邯郸县| 辽宁省| 江都市| 大方县| 凤阳县| 米泉市| 邻水| 喀喇沁旗| 怀来县| 固原市| 枞阳县| 寿光市| 陆河县| 江安县| 万载县| 敦化市| 禹城市|