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
})
原文地址:https://www.cnblogs.com/CreateBox/p/15194673.html