Skip to content

Latest commit

 

History

History
86 lines (67 loc) · 2.7 KB

坑爹的非对称秘钥研究之旅.md

File metadata and controls

86 lines (67 loc) · 2.7 KB
name title tags categories info time desc keywords
坑爹的非对称秘钥研究之旅
坑爹的非对称秘钥研究之旅
技术
瞎折腾
瞎折腾
Google 不出来的 BUG 除了跑不了以外,余下的便是第一个,状元,不也是第一个么。
2020/3/27
open-ssl 一次性生成全部 pem 格式
非对称秘钥
rsa
PKCS #8

坑爹的非对称秘钥研究之旅

引用资料:

open-ssl 一次性生成全部 pem 格式秘钥代码:

openssl genrsa -out rsa_private_key.pem 2048 &&
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key_2048.pem &&
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform pem -nocrypt -out private_pkcs8.pem &&
openssl rsa -in private_pkcs8.pem -out private_pkcs1.pem

起因

使用 node 进行开发的时候需要用到非对称加密解密库crypto,于是参考资料写了如下代码:

const crypto = require('crypto')

const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0B
。。。
kwIDAQAB
-----END PUBLIC KEY-----
`

const privateKey = `-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA1CrBTnEz
//。。。。。。。
C0RabbI28TVHpKfIISDIP9sI+Wg+XdwR
-----END RSA PRIVATE KEY-----
`

/**
 * @description 加密方法
 * @param {String} data 要加密的文本
 * @param {object} key 加密的公钥
 */
function encrypt (data, key) {
    // 注意,第二个参数是 Buffer 类型
    return crypto.publicEncrypt(key, Buffer.from(data))
}

/**
 * @description 解密方法
 * @param {String} encrypted 要解密的字符串
 * @param {object} key 解密的私钥
 */
function decrypt (encrypted, key) {
    // 注意,encrypted 是 Buffer 类型
    return crypto.privateDecrypt(key, encrypted)
}

console.log(decrypt(encrypt('测试消息', publicKey), privateKey).toString())

module.exports = {
    encrypt,
    decrypt
}

上面这段程序是正常的,在你用了正常的秘钥对的情况下

由于才疏学浅,也由于 Win 系统下的 puttygen.exe 程序生成的公钥默认是SSH2格式的,而crypto只能接受 pkcs 格式的秘钥对,所以导致程序一直报错。

换成了开头的命令所生成的公钥rsa_public_key_2048.pem,程序便能顺利执行。

偏偏这么简单的问题还 Google 不到,因此度过了一个异常暴躁的上午,得知真相之后深感自己真是菜的令人发抖,无出其右,2333。