无法从给定的 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
.
虽然 mod
和 exp
在 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"
}
我想知道并了解生成 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
.
虽然 mod
和 exp
在 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"
}