RSA_padding_check_PKCS1_OAEP_mgf1:oaep 解码错误

FST*_*STL 9 node.js ios swift

我正在尝试使用 iOS swift(客户端)在将某些数据发送到 node.js 服务器以对其进行解密之前对其进行加密。但是,在 node.js 中解密时,我遇到了:

Error: error:04099079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error
    at Object.privateDecrypt (internal/crypto/cipher.js:53:12)
    at decrypt (/Users/iosbeta/Documents/RSA/RSANode/testRsa.js:20:28)
    at Object.<anonymous> (/Users/RSANode/testRsa.js:36:13)
    at Module._compile (internal/modules/cjs/loader.js:777:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:788:10)
    at Module.load (internal/modules/cjs/loader.js:643:32)
    at Function.Module._load (internal/modules/cjs/loader.js:556:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:840:10)
    at internal/main/run_main_module.js:17:11 {
  library: 'rsa routines',
  function: 'RSA_padding_check_PKCS1_OAEP_mgf1',
  reason: 'oaep decoding error',
  code: 'ERR_OSSL_RSA_OAEP_DECODING_ERROR'
}
Run Code Online (Sandbox Code Playgroud)

我尝试仅使用 node.js 代码进行加密和解密,并且可以正常工作。但是,在使用 iOS 加密并使用 node.js 解密后,我无法让它工作。下面是我在 node.js 中生成证书、加密和解密的方法:

// ****************************************************************************************************************
// For generating keys
// ****************************************************************************************************************


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

function generateKeys() {
  const { privateKey, publicKey } = generateKeyPairSync('rsa', {
    modulusLength: 4096,
    publicKeyEncoding: {
      type: 'pkcs1',
      format: 'pem',
    },
    privateKeyEncoding: {
      type: 'pkcs1',
      format: 'pem',
      cipher: 'aes-256-cbc',
      passphrase: '',
    },
  })

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

// ****************************************************************************************************************
// For encrypting and decrypting
// ****************************************************************************************************************


const crypto = require('crypto')
const path = require('path')
const fs = require('fs')

function encrypt(toEncrypt, relativeOrAbsolutePathToPublicKey) {
  const absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey)
  const publicKey = fs.readFileSync(absolutePath, 'utf8')
  const buffer = Buffer.from(toEncrypt, 'utf8')
  const encrypted = crypto.publicEncrypt(publicKey, buffer)
  return encrypted.toString('base64')
}

function decrypt(toDecrypt, relativeOrAbsolutePathtoPrivateKey) {
  const absolutePath = path.resolve(relativeOrAbsolutePathtoPrivateKey)
  const privateKey = fs.readFileSync(absolutePath, 'utf8')
  const buffer = Buffer.from(toDecrypt, 'base64')
  const decrypted = crypto.privateDecrypt(
    {
      key: privateKey.toString(),
      passphrase: '',
    },
    buffer,
  )
  return decrypted.toString('utf8')
}
Run Code Online (Sandbox Code Playgroud)

这是使用公共 pem 证书和 SwiftyRSA 框架创建加密的 iOS swift 代码:

import SwiftyRSA

func createEncryption(){
    do {
        let publicKey = try PublicKey(pemNamed: "public")
        let clear = try ClearMessage(string: "Clear Text", using: .utf8)
        let encrypted = try clear.encrypted(with: publicKey, padding: .PKCS1)


        // Then you can use:
        let data = encrypted.data
        let base64String = encrypted.base64String

        print(base64String)
    } catch {
        // handle other errors
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 public.pem 文件:

-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEA2CtJRRthGDNTfbO1SO0MZWMKNC8YWA4ziAbrnYcdURGycg+RnfDw
hLb28kmPD2h6da/35LuklZHfGhgQSV1g288mdhKQILS9qjKI0/d0HRXxeOiOHiOl
zKhTHh+IsXRMQWrk8V2esnyNZVQ/rqr7t1YxQxGyp+eFoyH7//re9Kc8/hc9DRtq
+vcXKrX8m0K3M6t4fu9KH8iN0xlSeT9ufIrl//2/Omneic7ifZGNIVF+Grr8gpw4
CPYw1v8z6KjV8+5UhAmtiGjT2Jfcb8v9TKv6mBzYY15cvjAToWYxZaN3BPHx4yj5
7zdvewF4gIDM0O+XO9xShGCk213V4jdGyv21jaeMNqG6cmizzOHOZimpdy52cWou
ycBiIHQJrbSwGfxLtJt7D+DNLQibF35e3nQFYb+wiqtENRQJdUrZ37WmNPkpzlvY
dfYEfxWbgyckTmtCkqV6k2repYtbwb/l4AhYp/DgOPrV9waNTJqkNmy1fpfx8Azv
BLsII0MdXO5Ji1boAi3bf+IVuWlMVj5be4h/IJ2p0DGXiPh6cNWpmEXm1BoNrZ3B
GcnrAVp1Aa4FRR1kJUaHb47qVtStg2lyw0q+bwqE2vcGtRwEXWKIOQuXU9G7Z/Ug
CTHQunmMNWxMRQM+oZaxApv7F6ktUkj7nEz7P+a9ATRZNRA+71GtKecCAwEAAQ==
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

这是我的 private.pem 文件:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,D6F812707BED2D64ECE71D7FA6DDFF3F

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
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

更新:

设法通过在 Node.js 中添加填充类型参数来解决它

function decrypt(toDecrypt, relativeOrAbsolutePathtoPrivateKey) {
  const absolutePath = path.resolve(relativeOrAbsolutePathtoPrivateKey)
  const privateKey = fs.readFileSync(absolutePath, 'utf8')
  const buffer = Buffer.from(toDecrypt, 'base64')
  const decrypted = crypto.privateDecrypt(
    {
      key: privateKey.toString(),
      passphrase: '',
      padding:crypto.constants.RSA_PKCS1_PADDING
    },
    buffer,
  )
  return decrypted.toString('utf8')
}
Run Code Online (Sandbox Code Playgroud)