I have working code to decrypt a JWE encrypted Token payload in Jose.JWT, where the encrypted ciphertext is done using a PKCS 8 public key and the private key is in PEM format. But cannot find any working examples for System.IdentityModel.Tokens.Jwt.
Here is the working Jose.JWT code:
public static string DecryptJwt(string jweTokenBase64Url, string rsaPrivateKey)
{
Console.WriteLine("JWT JWE RSA-OAEP-256 AES GCM 256 encryption");
// https://www.nuget.org/packages/jose-jwt/
// https://github.com/dvsekhvalnov/jose-jwt
Console.WriteLine("\n* * * decrypt the payload with recipient\'s private key * * *");
string jweDecryptedPayload = jweRsaDecryptFromBase64UrlToken(rsaPrivateKey, jweTokenBase64Url);
Console.WriteLine("jweDecryptedPayload: " + jweDecryptedPayload);
return jweDecryptedPayload;
}
public static string jweRsaDecryptFromBase64UrlToken(string rsaPrivateKey, string jweTokenBase64Url)
{
RSA rsaAlg = RSA.Create();
byte[] privateKeyByte = getRsaPrivateKeyEncodedFromPem(rsaPrivateKey);
int _out;
rsaAlg.ImportPkcs8PrivateKey(privateKeyByte, out _out);
string json = "";
try
{
json = Jose.JWT.Decode(jweTokenBase64Url, rsaAlg);
}
catch (Jose.EncryptionException)
{
Console.WriteLine("*** Error: payload corrupted or wrong private key ***");
// throws: Jose.EncryptionException: Unable to decrypt content or authentication tag do not match.
}
return json;
}
static byte[] Base64Decoding(string input)
{
return Convert.FromBase64String(input);
}
private static byte[] getRsaPrivateKeyEncodedFromPem(string rsaPrivateKeyPem)
{
string rsaPrivateKeyHeaderPem = "-----BEGIN PRIVATE KEY-----\r\n";
string rsaPrivateKeyFooterPem = "-----END PRIVATE KEY-----";
string rsaPrivateKeyDataPem = rsaPrivateKeyPem.Replace(rsaPrivateKeyHeaderPem, "").Replace(rsaPrivateKeyFooterPem, "").Replace("\n", "");
return Base64Decoding(rsaPrivateKeyDataPem);
}
Here is the JWT Token:
eyJraWQiOiI2YjZkMWE1MzI3MzI2MGU5ZjA4MzMzMzhiNzJiMjE0YjczMmYzOTA0IiwiY3R5IjoianNvbiIsInR5cCI6IkpXVCIsImVuYyI6IkEyNTZHQ00iLCJhbGciOiJSU0EtT0FFUC0yNTYifQ.zZ6HO756d4NYjcHIpbvdLPzQ1XkLZi1eCsfh_oHuCB44DF3jewiQ5gTI_5SXJqWKpKIId52nMki29MbTMqOUH2iWNQIV8NYl_ERm8UGcJgr5IASMgZ-WyCgX-NQ_J7CONrTcyKvlsdyDvX1Jkp5MZfnpZuAbSzZsLWOwdqdrZHHMMRMeqwkinRrgvIobQPEN5qqVhy7saoBTHmqdTJzYopM1URFPmBcDVDuwkW4w4-mN-4JpkNpi5HGiad2_ZevVwy_e9Fgdwdjoj7D1pwfSZ7_BiriAymKdJ3LOn5H0x4d0F_CcNe6VzdIbVXj_ry1dp3S2ThW8Whq8j7Ja3vf3JA.jCBNb8g7girLmdqC.ZlfbFXVtnJoy0-OObmNMiNVQ89u0iPelznhrMPEuyNQ5esrHWGOuCzIWrwlFZXeKHmUDSl0cdgoBRzhQc4e5UoWfCyEtu24zpdMlUomFdG_k_sIhnWsEtWHaxMmvdpXMJgBmeJVrUtYj8vW6DrYTpMpgkjvaGH04lc50TE2ZxPYG550_kHL_2tqXlzHCL1q7wCF4qeS0trPLQAMT_SdzNWXl0xijE-u3A-G9NwfpKjoydil9DukWPd5fndvV24OzmvpYGz9r62XKbvfQUvzvhM0cLpXBpHKUM9pZBiq8Fat3fJubvXV2YcRREU__zzkFKcpCNvsIiRDXO9VEFSytcQLh8b4VKK5zsg8JYlauIf_K_yOg0FnOirwWbFIpA1P3-GD6KBFVhbjwDtpMXjT6K4ty7_GD_sMCUkbKffuRhfpxdEg1yOykpgA-XcBX-tRME5BDd9ZiJBm2EKXbcUT8COX54idTIiKxRftQKWRzqyD8VpvD6ixo9dsOwShzZrUenfrYDGJvncqYcRWdIcWFnJe5vxSxErAq1jwAgUe8eSQUQQ6aMZvDETmvpIrshGYWwCyGpUWEJFbT2PqfwJTsxi3a_ybegfRB36nHjyWt-kuSB6MyIP0VXFi1_kB3s_wdhbMZv_2CapyvjTXj-2jdcrxGz-72yIPEgjwa-vxB3MJq6rg1YWHyexv7pn9fpaerzwZlytMxa4iAO358bBrpj_vaQdfbeSsQr_uvgL3bDk4BkJvopKM9VL3kqPGUIZPpSWQCR2PJXdeRG1SjmzUA7ziL6FGrKpEXJfjCrzwsvWYQtWNPxdcwcg560EJqAT5G-Cru0ht4g4FmZHj7gEOnF7wxKtAD3wch-rixkP9SPSQRNzYu3mlSmpFJoCQvSu7cWD_Q7b4OFXlSswX0Mgs65oT1gg4m8bn7rbLYJZDylqKORIgMAZJPyLLykpY7NFgTVFkTo5c8QZix6FiGkBI.J8y8Uha83orFurzu-w4pAw
Here is the private key:
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDoT7Bef+L5Siww
zIeYK1LJkvMoXn7akq4UaRbdGRg7YDexMtPjrOsBXmXwiqDSG7FnbkwB2p0wSidX
TOaKmnW15BAmXenyauPXMe4NV+dEfn1ODkebBb9G71Qi4BWthT4WAswC/E5/YwMo
w0/QoIh5I1Iq7DzkFY7PS/xKSbaFRVpjrefsKWRvRoX6JHciWIfQ8AYZy4kYH3Da
Z8bV2eyAintufVHHsqWWjhDPWuzaGXHYWljBY3NOmTfr40GaXQknvEypoor41DOb
YWLsoqhIvhqCc36ajfq3qlV7g42hkJvCxa/VVhgDDz49Lu7CtvIAmKp/rH+kO9k7
fc7gW3BbAgMBAAECggEAZiUj12lD03jZlVtZA3+JFziV0do6zMBR6oeKlgzCqtjT
pAZFRIZzjlaDXBCYRcoHZwMISIhnNSRlx+z4MVlZCHEO6M/CXeTB6Yz6rsNH3MYB
MqD0uyT7xaTVyb/dyD4d3m+8ZFOr8DcI3JOENKdhWmI9bsIQw/j2og83DzL6Hf5a
GqFqxkviEKVPtRGCkmgjcmRgA97zpElluQdKqs+4YYYrZxHcC3A2vBuom3s3ZM01
YYEwi4U/hpIS76ipH1W5YfiFrXT7wE7FasUiulvlfsv6JM8FSjpLwHgFCmTB0VqZ
b1sdwBDXLqT/MvmTkOiLrffIaCvryZxjIHcY1yVVAQKBgQD1DihhczLtfLfCGF8T
UL+Ir9wVirdEgg9vskK9lsJKygHyV/Iw6lCQRB5jpL34Kjj8rs8SCmmpNxwmbVvQ
ZabhNPMQnDTQUq0aoicspybW+ZhA14hzcx3QSVuCCC1W4qIlqXOn+0WbPWJqKxs3
yeTv0yfXrDk29e57RRaZqENiowKBgQDyr9KE1yUDanYHcyw713j2XWtWHjoC4yFm
MvldhMrYkbsqcfdFj85gjGjPyTYEv8GFqY6G/iNW2ci/CShpme2DtF5GYDQUS18x
esSuh3NKUfpGZnc/zpov4PvoUvuzxxDDnuUIUjAe9lJxx1+0CTOMkTHMJUlRBKcW
onKjibNO6QKBgQCk8mep2JHSGx3RbvgoFzUlO0JH2bwsR+M+Ct4zoROcpcaTqjDi
TgX2ZXOTHKOmND1xj/TfrtSaSvcOwpOHfbTLaAmoB4zhIJVWFQmLW+Of1hdupeU5
2KWbupT2vKxQDHKaKSopSs/6g2IIFoXWknYgG6B44nsMjJN+s+1XdlQNQwKBgBtf
eX9CRQp9l5J/ix200A/5uYGdJy3sMHg2h6nksHx88392G03dSonZTHkjWNRwTIOm
/Ex9nb7OEbZ6cfR3SDLyxS9q6nTfi30pO8XzwS1A0dne9NRdmUaNOdyaf4lnipyF
749gtczIO8RZmJHV99qDBfrgucRJog8Lg6KuhWsBAoGBAOw69r23f+8XLYK2/CpO
hWxywjr0eQvBKSAhsyJ3mbu8RDYBlJUwabFocnd+p+gE/I+ygXGur73mSHZ/my2l
b9GremYECY55TtOpZtqSKh7dva+MYhYddc75GbPTeH9waAhxavgLXObpt/Rc1VAL
jSFPTXON8KhaCj6tf92zOAEk
-----END PRIVATE KEY-----
I have tried a lot of ways to use them without Jose.JWT but none have worked.