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

时间:2019-05-15 12:33:30

标签: node.js elixir rsa public-key

我在尝试使用由NodeJS Crypto加密的Elixir(使用ExCrypto-仅是对crypto和public_key的包装)进行解密时遇到麻烦。

这是有效的方法:

  • NodeJS中的encrypt_public->解密私有NodeJS(Works)
  • Elixir中的encrypt_public-> Elixir中的crypto_pricate(Works)

但是:

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

似乎Elixir中的crypto_private无法解密Node的crypto_public。 我什至直接用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填充不一样,但这似乎不是……有人有线索吗?

1 个答案:

答案 0 :(得分:4)

有2个问题 默认情况下,Node中的填充为:RSA_PKCS1_OAEP_PADDING 而默认值是erlang是:rsa_pkcs1_padding

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

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

第二个问题是,EXPublicKey尝试使用Base.url_decode64,而Node生成的Base64并非网址安全 要解决此问题:

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