zoukankan      html  css  js  c++  java
  • JavaScript生成RSA非对称秘钥

    JavaScript生成RSA非对称秘钥

    通过JavaScript生成RSA有两种方法。

    非对称密钥的核心原理是:将生成的公钥发送给后端,同时使用私钥将信息数据加密后发送给后端。后端使用传送的公钥进行解密,获取数据。

    window.crypto.subtle.generateKey()

    window.crypto.subtle.generateKey(
        {
            name: 'RSA-OAEP',	// 密钥加密算法
            modulusLength: 2048, // RSA模数长度	can be 1024, 2048, or 4096
            publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
            hash: { name: 'SHA-256' } // 要使用的摘要函数的名称的DOMString	can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
        },
        true, // 是否要开放导出	whether the key is extractable (i.e. can be used in exportKey)
        ['encrypt', 'decrypt'] // 指定新增的键的功能	must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
    ).then((key) => {
        window.crypto.subtle.exportKey(	// exportKey方法,导出密钥
            'pkcs8',	// 导出键的类型,'pkcs8'指的是RSA/椭圆曲线私钥
            key.privateKey	// 要导出的密钥
        ).then((keydata1) => {
            window.crypto.subtle.exportKey(
                'spki',
                key.publicKey
            ).then((keydata2) => {
                const privateKey = RSA2text(keydata1, 1)
                const publicKey = RSA2text(keydata2)
                resolve({ privateKey, publicKey })
                console.log(keydata1, keydata2)
            }).catch((err) => {
                console.error(err)
                reject(err)
            })
        }).catch((err) => {
            console.error(err)
            reject(err)
        })
    }).catch((err) => {
        console.error(err)
        reject(err)
    })
    
    function RSA2text (buffer, isPrivate = 0) {
      var binary = ''
      var bytes = new Uint8Array(buffer)
      var len = bytes.byteLength
      for (var i = 0; i < len; i++) {
        binary += String.fromCharCode(bytes[i])
      }
      var base64 = window.btoa(binary)
      var text = '-----BEGIN ' + (isPrivate ? 'PRIVATE' : 'PUBLIC') + ' KEY-----
    '
      text += base64.replace(/[^x00-xff]/g, '$&x01').replace(/.{64}x01?/g, '$&
    ')
      text += '
    -----END ' + (isPrivate ? 'PRIVATE' : 'PUBLIC') + ' KEY-----'
      return text
    }
    

    注意,该方法需要在安全上下文中才能使用。

    ※ 安全上下文:https请求下

    node-rsa

    // 使用node-rsa
    const key = new NodeRSA({b: 2048}).generateKeyPair()
    key.setOptions({signingScheme: 'pkcs1-sha256'})
    const publicKey = RSA2text(key.exportKey('pkcs8-public-der')) // 公钥
    const privateKey = RSA2text(key.exportKey('pkcs8-private-der'), 1) // 私钥
    resolve({
        privateKey: privateKey,
        publicKey: publicKey
    })
    
  • 相关阅读:
    [Matlab]二维统计分析图实例
    [Matlab]求解线性方程组
    [图论笔记]基本概念
    [线代笔记]第一章 线性方程组解法
    [Graphviz]一些简单的例子(未完待续)
    [杂记]如何在LaTeX里插入高亮代码
    [c语言]运算符的优先级与结合性
    [算法]连续子数组最大和
    dp超时的另外一种优化,找规律(四塔问题)
    饥饿的牛 线性dp内的区间
  • 原文地址:https://www.cnblogs.com/CreateBox/p/15194673.html
Copyright © 2011-2022 走看看