專案使用RSA加密方式,前端使用jsencrypt.js進行資料加密,后臺用.NET的RSACryptoServiceProvider 解密
一般情況下訪問正常,
但是偶爾會遇到意外情況。
比如加密后的base64編碼字串使用“==”結束時,導致我使用ToBase64String處理字串得到的byte陣列少一位,直接使用rsa的Decrypt方法解密時提示不正確的資料,采用末尾補0的方式,提示引數錯誤。
另外還有一些字串也直接提示引數錯誤,例如:
加密后結果:YvMWrCKcdJaKqoXcVzOCHlwhZ12Vxd1/L8poDbF4F/NnUXARpjitS4W+Rj7UMFktWlPPOKy0neUo4HD77N0lTjrSZoRsSrMAdKAjfo4WV+7jU0HP9hLoqDuvvA8grLNGVaxmXNu/dm7RrL9MFYw17JR4wnqhuJd7h4PZlIPRRlA=
公鑰:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDz20w6LiltaFYwJhXlbUXlI/bq
NINYWe9EdUYuPnapqRmmHczq6cA1uceWANPf8ClYjbw2ABgXJw1TQ/ejAAHqXB8c
kKoAIodyudrlcERt17f31R/Tspkqr0p1SlNgiVE1a+QcMeNtzCi7ahshgR5+4dKG
IKL91vDn55lO2INvkQIDAQAB
-----END PUBLIC KEY-----
私鑰:
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALLDg/93XO7EGQGn
i44ZMq47mGGXgpXmAAcImSZqGJZTmeiuGKfu7jqD7LFwSY+4U3YS8KA8QwS1jdtL
VALmOvD1lf+uek7set4ajNbHHbLIq3cWgO056fo29eVTbtNZ8Eolfy+VmKcpCyZR
LYr5OneTtpRfro+7Ogltmhn329ElAgMBAAECgYBqqyPekpkPmE/bnuA1QG/va3w3
77JqQ74MdGL+exyExwn1v7zSqE3a+NGJ55jde33B3PdchdjvvG4TRtWwjTTph0Bd
hC+yjdk5JAhxbnSNfIo3TdK2JD2UXbWWm6hMj9duFKrE9umXzuzRZ+ql/BFXxOtw
ijfjJZnfBK+jypBKWQJBAMQ3TL4P27j2vt5lSyAjHFTTR8EAjFqXYWtdFaZhGJVj
DSBModiQ76SyDLFjNOMNh0VXgFPy1XItQItPSOazNPMCQQDpOvN7bOFg7Dphf1Jr
JUvUnS1vcBdnRzp+ao2M06Y2IVez0j8r8nnVkhBc5lrpwbYRhacXXq69stI91OAO
hseHAkBqJTQ5uSB23dyBOLC8UOIZrTYq3V4P/8Zuqyt0FyCSZ8QJDgubuUQ6hytA
ptdMYNwlkeFVCI+ZNYuuERTx4E4rAkBwXw7g8NzGLgsS3p1/MkEO94vknUUpZZAx
SHVa3L7AZeAzq6D0M6ev1ug7WmGDLuniF1siT2Qx0e6qC97IIPgRAkEAqb2O6sv+
FetkpaTGJ7fCNiiiQSe/rwvd/cj+eO3qCqq61d0xg3ErMLEP/5rNZS4pn0DCAqle
pPrrfEnbAAUIew==
-----END PRIVATE KEY-----
相關代碼:
string t = @"TxnwTeo7vP/hVBmKgQghngAxzvePoDDExY3liVRpiqvB0bt4qHvuswF2BALEXhH0O5p7LZmJUE1Fn/64pVFgS1qZnMg4vvVM+i0wSwfBCOUow7zDSHwnLGRgbNDbd2V7k796AG6rK0DICM4ySBf6x/v3g0z6Fyyww1Wi9NN8i4c=";
string u = @"FsthrVnNuU231tA1AR31Rj4uliIYRFoVb0dQ4rRf7AkLP4vSm7nMNXmcmzVUXN2PkCsCD/QcH6BZ5BiQltJ5SvtZL4stK8mokKNeCcLBg4mNlN1PV005+LXZy5Hx6LAvpwEXv+oyk8y7EL4+D8e4hD3+90YS1593OewI2+Jf6rc=";
string c = @"YvMWrCKcdJaKqoXcVzOCHlwhZ12Vxd1/L8poDbF4F/NnUXARpjitS4W+Rj7UMFktWlPPOKy0neUo4HD77N0lTjrSZoRsSrMAdKAjfo4WV+7jU0HP9hLoqDuvvA8grLNGVaxmXNu/dm7RrL9MFYw17JR4wnqhuJd7h4PZlIPRRlA=";
string p = @"-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALLDg/93XO7EGQGn
i44ZMq47mGGXgpXmAAcImSZqGJZTmeiuGKfu7jqD7LFwSY+4U3YS8KA8QwS1jdtL
VALmOvD1lf+uek7set4ajNbHHbLIq3cWgO056fo29eVTbtNZ8Eolfy+VmKcpCyZR
LYr5OneTtpRfro+7Ogltmhn329ElAgMBAAECgYBqqyPekpkPmE/bnuA1QG/va3w3
77JqQ74MdGL+exyExwn1v7zSqE3a+NGJ55jde33B3PdchdjvvG4TRtWwjTTph0Bd
hC+yjdk5JAhxbnSNfIo3TdK2JD2UXbWWm6hMj9duFKrE9umXzuzRZ+ql/BFXxOtw
ijfjJZnfBK+jypBKWQJBAMQ3TL4P27j2vt5lSyAjHFTTR8EAjFqXYWtdFaZhGJVj
DSBModiQ76SyDLFjNOMNh0VXgFPy1XItQItPSOazNPMCQQDpOvN7bOFg7Dphf1Jr
JUvUnS1vcBdnRzp+ao2M06Y2IVez0j8r8nnVkhBc5lrpwbYRhacXXq69stI91OAO
hseHAkBqJTQ5uSB23dyBOLC8UOIZrTYq3V4P/8Zuqyt0FyCSZ8QJDgubuUQ6hytA
ptdMYNwlkeFVCI+ZNYuuERTx4E4rAkBwXw7g8NzGLgsS3p1/MkEO94vknUUpZZAx
SHVa3L7AZeAzq6D0M6ev1ug7WmGDLuniF1siT2Qx0e6qC97IIPgRAkEAqb2O6sv+
FetkpaTGJ7fCNiiiQSe/rwvd/cj+eO3qCqq61d0xg3ErMLEP/5rNZS4pn0DCAqle
pPrrfEnbAAUIew==
-----END PRIVATE KEY-----";
string xmls = @"<RSAKeyValue>
<D>aqsj3pKZD5hP257gNUBv72t8N++yakO+DHRi/nschMcJ9b+80qhN2vjRieeY3Xt9wdz3XIXY77xuE0bVsI006YdAXYQvso3ZOSQIcW50jXyKN03StiQ9lF21lpuoTI/XbhSqxPbpl87s0WfqpfwRV8TrcIo34yWZ3wSvo8qQSlk=</D>
<DP>aiU0Obkgdt3cgTiwvFDiGa02Kt1eD//GbqsrdBcgkmfECQ4Lm7lEOocrQKbXTGDcJZHhVQiPmTWLrhEU8eBOKw==</DP>
<DQ>cF8O4PDcxi4LEt6dfzJBDveL5J1FKWWQMUh1Wty+wGXgM6ug9DOnr9boO1phgy7p4hdbIk9kMdHuqgveyCD4EQ==</DQ>
<Exponent>AQAB</Exponent>
<InverseQ>qb2O6sv+FetkpaTGJ7fCNiiiQSe/rwvd/cj+eO3qCqq61d0xg3ErMLEP/5rNZS4pn0DCAqlepPrrfEnbAAUIew==</InverseQ>
<Modulus>ssOD/3dc7sQZAaeLjhkyrjuYYZeCleYABwiZJmoYllOZ6K4Yp+7uOoPssXBJj7hTdhLwoDxDBLWN20tUAuY68PWV/656Tux63hqM1scdssirdxaA7Tnp+jb15VNu01nwSiV/L5WYpykLJlEtivk6d5O2lF+uj7s6CW2aGffb0SU=</Modulus>
<P>xDdMvg/buPa+3mVLICMcVNNHwQCMWpdha10VpmEYlWMNIEyh2JDvpLIMsWM04w2HRVeAU/LVci1Ai09I5rM08w==</P>
<Q>6Trze2zhYOw6YX9SayVL1J0tb3AXZ0c6fmqNjNOmNiFXs9I/K/J51ZIQXOZa6cG2EYWnF16uvbLSPdTgDobHhw==</Q>
</RSAKeyValue>";
byte[] by = Convert.FromBase64String(c);
Response.Write(DAL.RSA_Decode.DecodeOrNull(c).Str);
//Response.Write(b.Length);
Response.Write(c);
Response.Write("<br/>");
Response.Write(Convert.ToBase64String(by));
Response.Write("<br/>");
Response.Write(by.Length.ToString());
Response.Write("<br/>");
Response.Write(RSADecrypt(xmls, c));
public string RSADecrypt(string xmlPrivateKey, string decryptString)
{
try
{
byte[] PlainTextBArray;
byte[] DypherTextBArray;
string Result;
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
rsa.FromXmlString(xmlPrivateKey);
PlainTextBArray = Convert.FromBase64String(decryptString);
DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);
Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
return Result;
}
catch (Exception ex)
{
return ex.Message.ToString();
}
}
uj5u.com熱心網友回復:
順便補充一下,加密之前的結果應該是“20210111163840”,RSA加密是設定的1024,所以不會是資料長度的原因。uj5u.com熱心網友回復:
NET 的 加密類都是很爛的,我從來都不用他的類別庫,自上開源專案后都用 BouncyCastle.Crypto ,你這個密匙是自己轉的吧,我記得他的密匙是 xml 的轉載請註明出處,本文鏈接:https://www.uj5u.com/net/247556.html
標籤:C#
上一篇:關于使用SerializeObject序列化有Image欄位的DataSet的問題
下一篇:iis部署web專案訪問時報錯
