NodeJS шифрование RSA, не совместимое с Elixir / Erlang PublicKey? - PullRequest
1 голос
/ 15 мая 2019

У меня возникают проблемы при попытке расшифровать в Elixir (используя ExCrypto - который является единственной оболочкой для crypto и public_key), зашифрованный NodeJS Crypto.

Вот что работает:

  • encrypt_public в NodeJS -> decrypt_private NodeJS (Работает)
  • encrypt_public в Elixir -> decrypt_pricate в Elixir (Работает)

Но:

  • encrypt_publicв NodeJS -> decrypt_private в Elixir (не работает)

Кажется, что encrypt_public от Node не может быть дешифрован decrypt_private в Elixir.Я даже пробовал трудный путь напрямую с модулем 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())

Но как только вы копируете / вставляете Base64генерируется в узле Вот что я получаю:

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

возвращает :error

Я подозревал, что отступы RSA отличаются, но, похоже, это не так ... У кого-нибудь естьподсказка?

1 Ответ

4 голосов
/ 15 мая 2019

Было 2 проблемы. Заполнение по умолчанию в узле: 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, в то время как Base64, сгенерированный Node, не является безопасным для URL. Чтобы это исправить:

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