c#Jose Jwt:从密钥对字符串签名并加密

c#Jose Jwt:从密钥对字符串签名并加密,c#,.net,encryption,sign,jose,C#,.net,Encryption,Sign,Jose,我是jwt的新手,在阅读了大量网页后,我还没有找到如何使用此网站生成的密钥对生成令牌(签名并加密的)的示例。我想这不会很难。我认为这是生成签名令牌的方法(我不知道是否正确): RSACryptoServiceProvider rsaCrypto=新的RSACryptoServiceProvider(); var payload=newdictionary() { {“jti”,“ORIGEN_389;”+Guid.NewGuid().ToString()}, {“iat”,DateTime.Ut

我是jwt的新手,在阅读了大量网页后,我还没有找到如何使用此网站生成的密钥对生成令牌(签名并加密的)的示例。我想这不会很难。我认为这是生成签名令牌的方法(我不知道是否正确):

RSACryptoServiceProvider rsaCrypto=新的RSACryptoServiceProvider();
var payload=newdictionary()
{
{“jti”,“ORIGEN_389;”+Guid.NewGuid().ToString()},
{“iat”,DateTime.UtcNow},
{“exp”,DateTime.UtcNow.AddYears(1)},
{“登录”,“用户”},
{“密码”,“密码”},
{“origen”,“origen”}
};
//包含要签名的公钥和私钥
var headers=newdictionary()
{
{“kty”,“RSA”},
{“d”,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个8级的电视节目,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频视频,一个视频,一个视频,一个视频视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频,一个视频视频,一个视频视频,一个视频,一个视频视频YMZGQFZKO-gtFaQH7_AJDVNQYKHSSCGYAROSZAQ“},
{“e”,“AQAB”},
{“使用”,“enc”},
{“孩子”,“RPA”},
{“alg”,“RS256”},
{“n”2.中国政府的一项研究成果是一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种新型的技术,一种技术,一种新型的技术,一种技术,一种新型的技术,一种技术,一种技术,一种技术,一种新型的技术,一种技术,一种新型的技术,一种技术,一种技术,一种新型的技术,一种技术,一种新型的技术,一种技术,一种技术,一种技术,一种新型的技术,一种技术,一种新型的技术,一种技术,一种技术,一种技术,一种技术,一种技术,一种技术,一种技术,一种新型的技术,一种技术,一种新型LBFLEGKIYZQPD7IGW“}
};
字符串tokenSigned=JWT.Encode(有效负载、rsacypto、JwsAlgorithm.RS256、头);
我得到一个令牌(我想是签名的),但如果我把这个令牌放在这个网站上,我会得到一个错误“无效签名”。 另外,我想用公钥加密此令牌。因此我执行以下操作:

// Another public key to encrypt
headers = new Dictionary<string, object>()
        {
            { "kty", "RSA" },
            { "e", "AQAB" },
            { "use", "enc"},                
            { "alg", "RS256" },
            { "n", "ldMvqNDlz8-ABqEhqjtT0qvjKKbJMQ4J6GEi-7QrY-EUtyjCE7cOriHrYmbjt3o3zXwUTyOp0-twnF5j1HXFwVk7_XNsZz7LUmGNtmnqgB2iw2xhS7LAicN0RRgIbxWRDLOaaZ-49QumX6_r_jLNtIspKiFiuUNf2s0ipeAjWBFquiiqTMBd98z3pS-vC5y0CfzPbTSLSinikrHkIW2uO4FNHWZpoo8npn7vwWtAJjknWhaFi2s9P5kzUk4Mpbdx4DxUJ9ZvUi9SmdvH2vUzwGe0lxyvlw0DAMMWAT9TmsiKzBeXTY6rQ1-2Edn4F9S5kkPNOh1NqJoebz50-Bpl6w" }
        };

string tokenEncrypted = JWT.Encode(payload, tokenSigned , JweAlgorithm.RSA_OAEP, JweEncryption.A256GCM, extraHeaders: headers);
//另一个要加密的公钥
headers=newdictionary()
{
{“kty”,“RSA”},
{“e”,“AQAB”},
{“使用”,“enc”},
{“alg”,“RS256”},
{“n”4.中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思意思意思意思是一个中文意思意思是一个中文意思意思是一个中文意思是一个中文意思意思是一个中文意思意思是一个中文意思意思意思是一个中文意思意思意思意思意思意思意思是一个中文意思是一个中文意思是一个中文意思是一个中文意思意思意思意思意思意思意思意思意思是一个中文意思意思是一个中文意思意思是F9S5Kpnoh1NQJOEBZ50-Bpl6w“}
};
string tokenEncrypted=JWT.Encode(有效载荷、tokenSigned、JweAlgorithm.RSA_OAEP、JweEncryption.A256GCM、extraHeaders:headers);
但我总是得到错误“RsaKeyManagement alg期望密钥为RSACryptoServiceProvider类型”。我已经搜索了此错误,但没有任何明确信息。 求求你,有人能帮我吗?我不确定我是不是走对了路

我将jose jwt用于.net,因为我读到library System.IdentityModel.Tokens.jwt无法加密

多谢各位。
注意。

在这种情况下,我有一个jwk,我想用我的私钥对它进行签名,然后用客户的公钥对它进行加密。这个jwk一直都是相同的,所以我只需要生成一次。为此,您需要创建一个RSA对象,然后使用库的Encode方法进行签名和加密。 jwk有几个参数:

JSON Web密钥(JWK):表示加密密钥的JSON对象。 对象的成员表示密钥的属性,包括 它的价值。 以下是一些参数:

p='RSA秘密素数'; kty=“键类型”; q='RSA秘密素数'; d=“RSA秘密指数”; e=“RSA公共指数”; 孩子=“钥匙ID”; n='RSA公共模'; 使用=“公钥使用”; alg=“算法”

但在我的例子中,我只有其中的一些:d,e,n,kty,use,kid,alg。问题是如果你有e和d参数,你也需要p和q,因为你不能用没有素数(p和q)的.NET构造私钥

解决方案是将问题分为两部分:

JAVA部分:使用以下内容创建完整的jwk:

C#零件: 使用前面的jwk在C#with中创建RSA对象。如下所示:

var js = new JavaScriptSerializer();    
// json is the result returned by java
var jwk = js.Deserialize<IDictionary<string, string>>(json);

byte[] p = Base64Url.Decode(jwk["p"]);
byte[] q = Base64Url.Decode(jwk["q"]);
byte[] d = Base64Url.Decode(jwk["d"]);
byte[] e = Base64Url.Decode(jwk["e"]);
byte[] qi = Base64Url.Decode(jwk["qi"]);
byte[] dq = Base64Url.Decode(jwk["dq"]);
byte[] dp = Base64Url.Decode(jwk["dp"]);
byte[] n = Base64Url.Decode(jwk["n"]);

RSA key = RSA.Create();
RSAParameters keyParams = new RSAParameters();
keyParams.P = p;
keyParams.Q = q;
keyParams.D = d;
keyParams.Exponent = e;
keyParams.InverseQ = qi;
keyParams.DP = dp;
keyParams.DQ = dq;
keyParams.Modulus = n;

key.ImportParameters(keyParams);
var js=new JavaScriptSerializer();
//json是java返回的结果
var jwk=js.Deserialize(json);
字节[]p=Base64Url.Decode(jwk[“p”]);
字节[]q=Base64Url.Decode(jwk[“q”]);
字节[]d=Base64Url.Decode(jwk[“d”]);
字节[]e=Base64Url.Decode(jwk[“e”]);
字节[]qi=Base64Url.Decode(jwk[“qi”]);
字节[]dq=Base64Url.Decode(jwk[“dq”]);
字节[]dp=Base64Url.Decode(jwk[“dp”]);
字节[]n=Base64Url.Decode(jwk[“n”]);
RSA key=RSA.Create();
RSAParameters keyParams=新的RSAParameters();
keyParams.P=P;
keyParams.Q=Q;
keyParams.D=D;
keyParams.指数=e;
keyParams.InverseQ=qi;
keyParams.DP=DP;
keyParams.DQ=DQ;
键参数模量=n;
关键输入参数(关键参数);
拥有RSA对象后,可以对其进行签名:

var payload = new Dictionary<string, object>()
{       
    {"user", USER },
    {"password", PASSWORD }            
};

string tokenSigned = JWT.Encode(payload, key, JwsAlgorithm.RS256);
var payload=newdictionary()
{       
{“用户”,用户},
{“密码”,密码}
};
字符串tokenSigned=JWT.Encode(有效负载、密钥、JwsAlgorithm.RS256);
您可以在中找到原始解决方案

问候

var payload = new Dictionary<string, object>()
{       
    {"user", USER },
    {"password", PASSWORD }            
};

string tokenSigned = JWT.Encode(payload, key, JwsAlgorithm.RS256);