NodeJS 加密 RSA,与 Elixir/Erlang 公钥不兼容?
NodeJS crypto RSA, not compatible with Elixir/Erlang PublicKey?
我在 Elixir 中尝试解密时遇到问题(使用 ExCrypto - 它只是一个围绕加密的包装器 public_key)由 NodeJS Crypto 加密。
这是有效的:
- encrypt_public 在 NodeJS 中 -> decrypt_private NodeJS(有效)
- encrypt_public 在 Elixir 中 -> decrypt_pricate 在 Elixir (Works)
但是:
- encrypt_public 在 NodeJS 中 -> decrypt_private 在 Elixir 中(不起作用)
看来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)
我在 Elixir 中尝试解密时遇到问题(使用 ExCrypto - 它只是一个围绕加密的包装器 public_key)由 NodeJS Crypto 加密。
这是有效的:
- encrypt_public 在 NodeJS 中 -> decrypt_private NodeJS(有效)
- encrypt_public 在 Elixir 中 -> decrypt_pricate 在 Elixir (Works)
但是:
- encrypt_public 在 NodeJS 中 -> decrypt_private 在 Elixir 中(不起作用)
看来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)