我在尝试使用由NodeJS Crypto加密的Elixir(使用ExCrypto-仅是对crypto和public_key的包装)进行解密时遇到麻烦。
这是有效的方法:
但是:
似乎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填充不一样,但这似乎不是……有人有线索吗?
答案 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)