将python RSA加密算法转换为JS



标题不是最好的,因为它听起来像我想在JS中构建自己的RSA加密算法,但让我解释一下。

我想通过Steam服务器进行身份验证。4个帖子请求2个网址,这篇文章的主要网址是https://store.steampowered.com/login/getrsakey它返回3个重要的东西RSA时间戳,模数和指数。我不会在这里发布数据,因为我不确定它是否包含任何重要的东西,但很容易获得(在donotcache下提供您的steam用户名作为usernameDate.now() * 1000)。将其添加到表单数据中,并向url发出POST请求)

我在github上找到了一个python脚本,它实现了登录到steam。这是我想转换成JS的代码:

mod = long(str(data["publickey_mod"]), 16)
exp = long(str(data["publickey_exp"]), 16)
rsa = RSA.construct((mod, exp))
cipher = PKCS1_v1_5.new(rsa)
print base64.b64encode(cipher.encrypt(passwd))

它使用来自响应的数据来构造RSA密钥。从该密钥创建PKCS1_v1_5密码,然后对密码进行加密。我已经有了NodeRSA,但由于某种原因,它打破了一个承诺。今天,我来到这个加密库,我尝试了这个例子(rsa.sign的例子,因为我不能在rsa.encryptRSASSA-PKCS1-v1_5名称中传递)首先从url传递了普通的publickey_modpublickey_exp,但它出错了:

Error: UnsupportedEnvironment: Cannot create a key using the specified key usages.

我也试过:

const n = Buffer.from(mod, "hex");
const e = Buffer.from(exp, 0);

,我从一个NodeRSA的例子。

Error: UnsupportedEnvironment: The JWK member "n" could not be base64url decoded or contained padding
这个密码很难加密,我想知道是否有人可以提供一些帮助?

所以我试着翻译它,我做到了。事实证明,当将模数从十六进制转换为整数时,它是巨大的,所以JS根本不支持它。我尝试了bigInt库,但我很快就放弃了,因为我不想重写所有的东西。

我决定更努力地看看别人是否尝试过这个,我发现了一个以不同方式工作的身份验证脚本。它创建一个RSA PEM,然后将其馈送到NodeRSA,而不是像python那样从模数和指数的元组中构造密钥。这是函数:https://github.com/winauth/SteamAuth/blob/62e08de0159d208554a92283bba3458021479335/index.js#L924

最新更新