name | title | tags | categories | info | time | desc | keywords | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
坑爹的非对称秘钥研究之旅 |
坑爹的非对称秘钥研究之旅 |
|
瞎折腾 |
Google 不出来的 BUG 除了跑不了以外,余下的便是第一个,状元,不也是第一个么。 |
2020/3/27 |
open-ssl 一次性生成全部 pem 格式 |
|
引用资料:
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。