NodeJS 加密 RSA,与 Elixir/Erlang 公钥不兼容?

NodeJS crypto RSA, not compatible with Elixir/Erlang PublicKey?

我在 Elixir 中尝试解密时遇到问题(使用 ExCrypto - 它只是一个围绕加密的包装器 public_key)由 NodeJS Crypto 加密。

这是有效的:

但是:

看来Node中的encrypt_public,无法被Elixir中的decrypt_private解密。 我什至直接用 Erlang 模块尝试了困难的方法 public_key,它给了我相同的结果。

这是我试过的:

var fs = require("fs")
var crypto = require("crypto")

var rsa_key = fs.readFileSync('./priv/public.key').toString()
var rsa_priv = fs.readFileSync('./priv/private.key').toString()
var buffer = Buffer.from("Hello world")
var encrypted_auth = crypto.publicEncrypt({key: rsa_key}, buffer)
console.log("copy/paste this in iex: ", encrypted_auth.toString("Base64"))
var crypted_buffer = Buffer.from(encrypted_auth)
var decrypted_auth = crypto.privateDecrypt({key: rsa_priv, passphrase: "my_pass_phrase"}, crypted_buffer)
console.log("--- Res: ", decrypted_auth.toString())

但是一旦你 copy/paste 在 Node 中生成的 Base64 这就是我得到的:

key = ExPublicKey.load!("./priv/private.key", "my_pass_phrase")
cipher = "PASTED BASE64 FROM NODE"
ExPublicKey.decrypt_private(cipher, key)

returns :error

我怀疑 rsa 填充是不同的,但似乎不是这样……有人知道吗?

有 2 个问题 Node 中的默认填充是:RSA_PKCS1_OAEP_PADDING 而默认的是 erlang 是:rsa_pkcs1_padding

解决方案是修改节点中的填充:

var encrypted_auth = crypto.publicEncrypt({key: rsa_key, padding: crypto.constants.RSA_PKCS1_PADDING}, buffer)

第二个问题是,EXPublicKey 正在尝试使用 Base。url_decode64 而 Node 生成的 Base64 并不 url 安全 要解决这个问题:

ExPublicKey.decrypt_private(cipher, key, url_safe: false)