【问题标题】:Asymmetric Encryption using Nodejs Crypto module使用 Nodejs Crypto 模块的非对称加密
【发布时间】:2019-06-02 21:25:29
【问题描述】:

我想用nodejs10的crypto模块,做一个非对称加密。

我找到了答案here 但是当我尝试运行下面的代码时,我得到了这个错误:

return method(toBuf(key), buffer, padding, passphrase);
           ^
Error: error:0608B096:digital envelope routines:EVP_PKEY_encrypt_init:operation not supported for this keytype.

代码:

var crypto = require("crypto");
var path = require("path");
var fs = require("fs");
const passphrase = "mySecret"

var encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) {
  var absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey);
  var publicKey = fs.readFileSync(absolutePath, "utf8");
  var buffer = new Buffer(toEncrypt);
  var encrypted = crypto.publicEncrypt(publicKey, buffer);
  return encrypted.toString("base64");
};

var decryptStringWithRsaPrivateKey = function(toDecrypt, relativeOrAbsolutePathtoPrivateKey) {
  var absolutePath = path.resolve(relativeOrAbsolutePathtoPrivateKey);
  var privateKey = fs.readFileSync(absolutePath, "utf8");
  var buffer = new Buffer(toDecrypt, "base64");
  //var decrypted = crypto.privateDecrypt(privateKey, buffer);
  const decrypted = crypto.privateDecrypt(
    {
      key: privateKey.toString(),
      passphrase: passphrase,
    },
    buffer,
  )
  return decrypted.toString("utf8");
};

const { writeFileSync } = require('fs')
const { generateKeyPairSync } = require('crypto')

function generateKeys() {
  const { privateKey, publicKey } = generateKeyPairSync('ec', {
    namedCurve: 'secp256k1',
    publicKeyEncoding: {
      type: 'spki',
      format: 'pem',
    },
    privateKeyEncoding: {
      type: 'pkcs8',
      format: 'pem',
      cipher: 'aes-256-cbc',
      passphrase: passphrase,
    },
  })

  writeFileSync('private.pem', privateKey)
  writeFileSync('public.pem', publicKey)
}

generateKeys();

let a = encryptStringWithRsaPublicKey("hello", "public.pem")
let b = decryptStringWithRsaPrivateKey(a, "private.pem");
console.log(b)

没找到问题,好像是密码的问题。

【问题讨论】:

    标签: node.js cryptojs encryption-asymmetric


    【解决方案1】:

    在生成私钥时更新一些参数即可:

    var crypto = require("crypto");
    var path = require("path");
    var fs = require("fs");
    const passphrase = "mySecret"
    
    var encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) {
        var absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey);
        var publicKey = fs.readFileSync(absolutePath, "utf8");
        var buffer = Buffer.from(toEncrypt);
        var encrypted = crypto.publicEncrypt(publicKey, buffer);
        return encrypted.toString("base64");
    };
    
    var decryptStringWithRsaPrivateKey = function(toDecrypt, relativeOrAbsolutePathtoPrivateKey) {
        var absolutePath = path.resolve(relativeOrAbsolutePathtoPrivateKey);
        var privateKey = fs.readFileSync(absolutePath, "utf8");
        var buffer = Buffer.from(toDecrypt, "base64");
        const decrypted = crypto.privateDecrypt(
            {
                key: privateKey.toString(),
                passphrase: passphrase,
            },
            buffer,
        )
        return decrypted.toString("utf8");
    };
    
    const { writeFileSync } = require('fs')
    const { generateKeyPairSync } = require('crypto')
    
    function generateKeys() {
        const { publicKey, privateKey } = generateKeyPairSync('rsa', 
        {
                modulusLength: 4096,
                namedCurve: 'secp256k1', 
                publicKeyEncoding: {
                    type: 'spki',
                    format: 'pem'     
                },     
                privateKeyEncoding: {
                    type: 'pkcs8',
                    format: 'pem',
                    cipher: 'aes-256-cbc',
                    passphrase: passphrase
                } 
        });
        
        writeFileSync('private.pem', privateKey)
        writeFileSync('public.pem', publicKey)
    }
    
    generateKeys();
    
    let a = encryptStringWithRsaPublicKey("hello", "public.pem")
    let b = decryptStringWithRsaPrivateKey(a, "private.pem");
    console.log(b)
    

    【讨论】:

    • 默认密码是什么意思?
    • 我已经更新了答案,你可以试一试,我相信模数长度是拼图中缺失的部分!
    • 默认密码实际上没有任何意义! (我的错误,我误读了文档,它实际上会使密钥未加密)。但是,由于我已经更新了答案,我们现在使用 aes-256-cbc,所以我们为密钥指定了一个强密码。
    • 太好了,很高兴听到,我认为问题在于您收到的错误消息非常混乱!
    • 您应该将“new Buffer(....)”更新为“Buffer.from(...)”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2018-01-09
    • 2023-03-08
    • 1970-01-01
    • 2020-08-25
    • 2012-08-08
    相关资源
    最近更新 更多