【问题标题】:NodeJS crypto RSA, not compatible with Elixir/Erlang PublicKey?NodeJS 加密 RSA,与 Elixir/Erlang PublicKey 不兼容?
【发布时间】:2019-05-15 12:33:29
【问题描述】:

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

这是有效的:

  • NodeJS 中的encrypt_public -> decrypt_private NodeJS(工程)
  • Elixir 中的encrypt_public -> Elixir 中的 decrypt_pricate (Works)

但是:

  • NodeJS 中的encrypt_public -> Elixir 中的 decrypt_private(不起作用)

似乎来自 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())

但是只要你复制/粘贴在 Node 中生成的 Base64,我就得到了:

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

返回:error

我怀疑 rsa 填充不同,但似乎并非如此……有人知道吗?

【问题讨论】:

    标签: node.js elixir rsa public-key


    【解决方案1】:

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

    解决办法是修改 Node 中的 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)
    

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2020-06-29
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2015-07-27
      • 2019-06-28
      相关资源
      最近更新 更多