无法从给定的 mod 和 exp 生成 public 密钥。投掷 "Bad Data"

Unable to generate public key from given mod and exp. Throws "Bad Data"

我想知道并了解生成 JWE 的过程。我提供了以下详细信息:

string mod = "2737"; // 这是一个仅由数字构成的 618 字符长字符串。

string exp = "65537";

string kid = "APIKEY.XX.665_Priv";

string keyEncAlgo = "RSA-OAEP";

string contentEncAlgo = "A256GCM";

还有 json 格式的 payload

由于我在该领域的知识有限,我使用 RSACryptoServiceProvider 创建了一个 public 密钥。并计划使用 Jose.Jwt 库。

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAPaeameters rsaKeyInfo = new RSAPaeameters();
rsaKeyInfo.Modulus = Encode.ASCII.GetBytes(mod);
rsaKeyInfo.Exponent = Encode.ASCII.GetBytes(exp);
rsa.ImportParameters(rsaKeyInfo);

上面代码的最后一行 rsa.ImportParameters(rsaKeyInfo) 抛出异常 bad data.

虽然 modexp 在 Java 应用程序中使用,但最终一切正常。我正在将该 Java 代码转换为 C#。我在这里做错了什么。或者我理解错了过程。

模数(假设 2737 只是开始)和指数似乎是十进制表示形式(作为字符串)。

在 .NET5+(和 .NET Core 2.1+)下,可以按如下方式导入:

using System.Numerics;
using System.Security.Cryptography;
...
string mod = "2737...";
string exp = "65537";
var rsaPublic = new RSACryptoServiceProvider();
rsaPublic.ImportParameters(new RSAParameters
{
    Modulus = BigInteger.Parse(mod).ToByteArray(true, true),
    Exponent = BigInteger.Parse(exp).ToByteArray(true, true)
});

请注意,字节数组是无符号的(第一个 true)并且具有大端字节顺序(第二个 true)。


jose-jwt 的 JWE 示例是:

using Jose;
using System.Collections.Generic;
...
IDictionary<string, object> addHeaders = new Dictionary<string, object>()
{
    { "kid", "APIKEY.XX.665_Priv" },
};

string payload = "some string";
string token = JWT.Encode(payload, rsaPublic, JweAlgorithm.RSA_OAEP, JweEncryption.A256GCM, null, addHeaders);

使用以下 header(如果 Base64 解码):

{
    "alg":"RSA-OAEP",
    "enc":"A256GCM",
    "kid":"APIKEY.XX.665_Priv"
}