代码之家  ›  专栏  ›  技术社区  ›  maroodb

使用Nodejs加密模块的非对称加密

  •  0
  • maroodb  · 技术社区  · 7 年前

    我想使用nodejs10的加密模块来进行非对称加密。

    我找到了答案 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)
    

    1 回复  |  直到 7 年前
        1
  •  2
  •   Terry Lennox    5 年前

    更新私钥生成中的一些参数将使此工作正常:

    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)
    
    推荐文章