成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Ed25519應用,node,js生成常用的密鑰對

Yumenokanata / 1746人閱讀

摘要:生成用戶常規(guī)保存的字符串。首先安裝依賴包解釋簡單解釋說明下包的作用最核心的包是用接口實現(xiàn)的端口,它實現(xiàn)了密鑰加密解密,公鑰驗證加密,公共簽名,等。我們將使用這個庫生成,原始的密鑰對。生成校驗碼的是一個一致性模塊化高性能的實用工具庫。

Ed25519簽名算法介紹 Ed25519作者

Daniel J. Bernstein 是世界著名的密碼學家

優(yōu)勢

完全開放設計,算法各個參數(shù)直接了當,明確,很大的概率通過緩存、時間、惡意輸入摧毀安全性,而 25519 系列橢圓曲線經(jīng)過特別設計,盡可能的將出錯的概率降到了最低,25519 系列曲線是目前最快的橢圓曲線加密算法,一個4核2.4GHz 的 Westmere cpu,每秒可以驗證 71000 個簽名,吊打同類:橢圓曲線是 NIST

基本特點

公共鑰只有32字節(jié),私鑰只有64字節(jié)

實戰(zhàn)node,js生成Ed25519密鑰對 目標

通過tweetnacl生成原始的Uint8Array密鑰對,生成公鑰,私鑰類型首字母G,S寫入Buffer,然后私鑰寫入Buffer,通過上面Buffer計算校驗碼再次寫入buffer,最后使用base32編碼。生成用戶常規(guī)保存的字符串。

首先安裝依賴包

npm I tweetnacl crc lodash base32.js —save
解釋簡單解釋說明下包的作用
tweetnacl: 最核心的包,是用javascript接口實現(xiàn)的TweetNaci/Naci端口,它實現(xiàn)了密鑰加密解密,公鑰驗證加密,公共簽名,hash等。我們將使用這個庫生成,原始的Uint8Array密鑰對。也可以自己隨機一個64byte私鑰,然后解析為keypair。
crc:生成校驗碼的
lodash:是一個一致性、模塊化、高性能的 JavaScript 實用工具庫。
base32.js:由于原生方法,只有base64,所以引入base32.js進行編碼解碼

具體代碼實現(xiàn)
//各種引入  
const nacl = require(“tweetnacl");
const crc = require("crc");
const base32 = require("base32.js")
const isUndefined = require("lodash/isUndefined");
const isNull = require("lodash/isNull");
const isString = require("lodash/isString");
const versionBytes = {
  ed25519PublicKey:  6 << 3, // G
  ed25519SecretSeed: 18 << 3, // S
  preAuthTx:         19 << 3, // T
  sha256Hash:        23 << 3  // X
};

//封裝一個類,構造函數(shù)中生成keypair,提供靜態(tài)編碼解碼公鑰私鑰方法
class Keypair {
    constructor(){
        this.orikeypair = nacl.sign.keyPair();
        this.publicKey = Buffer.from(this.orikeypair.publicKey);
        console.log(this.orikeypair.publicKey);
        this.privateKey = Buffer.from(this.orikeypair.secretKey);
    }
    static encodeCheck(versionByteName, data) {
        if (isNull(data) || isUndefined(data)) {
            throw new Error("cannot encode null data");
        }
        let versionByte = versionBytes[versionByteName];
        if (isUndefined(versionByte)) {
            throw new Error(`${versionByteName} is not a valid version byte name.  expected one of "ed25519PublicKey", "ed25519SecretSeed", "preAuthTx", "sha256Hash"`);
        }
        data  = Buffer.from(data);
        let versionBuffer = Buffer.from([versionByte]);
        let payload       = Buffer.concat([versionBuffer, data]);
        let checksum      = calculateChecksum(payload);
        let unencoded     = Buffer.concat([payload, checksum]);
        return base32.encode(unencoded);
    }
    static decodeCheck(versionByteName, encoded) {
        if (!isString(encoded)) {
          throw new TypeError("encoded argument must be of type String");
        }
        let decoded     = base32.decode(encoded);
        let versionByte = decoded[0];
        let payload     = decoded.slice(0, -2);
        let data        = payload.slice(1);
        let checksum    = decoded.slice(-2);
        if (encoded != base32.encode(decoded)) {
          throw new Error("invalid encoded string");
        }
        let expectedVersion = versionBytes[versionByteName];
        if (isUndefined(expectedVersion)) {
          throw new Error(`${versionByteName} is not a valid version byte name.  expected one of "accountId" or "seed"`);
        }
        if (versionByte !== expectedVersion) {
          throw new Error(`invalid version byte. expected ${expectedVersion}, got ${versionByte}`);
        }
        let expectedChecksum = calculateChecksum(payload);
        if (!verifyChecksum(expectedChecksum, checksum)) {
          throw new Error(`invalid checksum`);
        }
        return Buffer.from(data);
    } 
}
function calculateChecksum(payload) {
  // This code calculates CRC16-XModem checksum of payload
  // and returns it as Buffer in little-endian order.
  let checksum = Buffer.alloc(2);
  checksum.writeUInt16LE(crc.crc16xmodem(payload), 0);
  return checksum;
}
//測試使用
let newKeypair = new Keypair();
console.log(newKeypair.publicKey);
let newPublic = Keypair.encodeCheck("ed25519PublicKey",newKeypair.publicKey);
let newPrivate = Keypair.encodeCheck("ed25519SecretSeed",newKeypair.privateKey);
let publicBuffer = Keypair.decodeCheck("ed25519PublicKey",newPublic);
console.log(newPublic,newPrivate);
console.log(publicBuffer);
說明

相關包的詳細api可以直接復制包名字在github查找

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24357.html

相關文章

  • 2021年,用更現(xiàn)代方法使用PGP(中)

    摘要:世界上有兩種密碼一種是防止你的小妹妹偷看你的文件另一種是防止當局閱讀你的文件應用密碼學上篇鏈接年,用更現(xiàn)代的方法使用上三安全使用和備份準備為了安全性,建議在一臺斷網(wǎng)的或者系統(tǒng)上生成你的密鑰對。世界上有兩種密碼:一種是防止你的小妹妹偷看你的文件;另一種是防止當局閱讀你的文件.? ...

    Tecode 評論0 收藏0
  • Linux 系統(tǒng)服務器設置 SSH 通過密鑰登錄

    摘要:系統(tǒng)服務器的登錄方式最常見的有兩種通過用戶密碼登錄或者采用密鑰對登錄。服務器打開密鑰登錄功能編輯文件,進行如下設置阻止用戶通過登錄以密鑰方式登錄下下當你完成全部設置,并以密鑰方式登錄成功后,再禁用密碼登錄最后,重啟服務Linux 系統(tǒng)服務器的SSH登錄方式最常見的有兩種:通過用戶密碼登錄或者采用密鑰對登錄。其中使用用戶密碼方式登錄,容易有密碼被暴力破解的問題。為了安全,可以使用 1Passw...

    Tecode 評論0 收藏0
  • 剝開比原看代碼10:比原是如何通過/create-key接口創(chuàng)建密鑰

    摘要:如果傳的是,就會在內(nèi)部使用默認的隨機數(shù)生成器生成隨機數(shù)并生成密鑰。使用的是,生成的是一個形如這樣的全球唯一的隨機數(shù)把密鑰以文件形式保存在硬盤上。 作者:freewind 比原項目倉庫: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 在前一篇,我們探討了從瀏覽器的dashb...

    ccj659 評論0 收藏0
  • Bytom國密網(wǎng)說明和指南

    摘要:在比原鏈主網(wǎng)中,在獲取交易和區(qū)塊頭等摘要的過程中使用的哈希算法是算法,而在國密測試網(wǎng)中,使用算法替代。啟動的是國密測試網(wǎng)??梢哉f,比原鏈的項目進展伴隨著國密測試網(wǎng)的發(fā)布更上一層樓。 比原項目倉庫: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 國密算法是指國家密碼管理局制...

    王巖威 評論0 收藏0
  • 剝開比原看代碼04:如何連上一個比原節(jié)點

    摘要:總的來說,在比原中有一個類,它用于集中處理節(jié)點與外界交互的邏輯,而它的創(chuàng)建和啟動,又都是在中進行的。我考慮的是這樣一種情況,比如某用戶在筆記本上運行比原節(jié)點,然后在公開場合上網(wǎng),使用了黑客提供的。 作者:freewind 比原項目倉庫: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBloc...

    BigNerdCoding 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<