RSA加解密:算法
1024位的證書,加密時最大支持117個字節,解密時爲128;
2048位的證書,加密時最大支持245個字節,解密時爲256。安全
加密時支持的最大字節數:證書位數/8 -11(好比:2048位的證書,支持的最大加密字節數:2048/8 - 11 = 245)加密
.NET中的RSA加密算法爲了提升安全性,在待加密數據前要添加一些隨機數,所以,使用.NET中的RSA加密算法一次最多加密117字節數據(多於117字節須要拆分紅多段分別加密再鏈接起來),通過加密後獲得一個長度爲128字節的加密數據。spa
RSA實際可加密的明文長度最大也是1024bits,但問題就來了:若是小於這個長度怎麼辦?就須要進行padding,由於若是沒有padding,用戶沒法區分解密後內容的真實長度,字符串之類的內容問題還不大,以0做爲結束符,但對二進制數據就很難理解,由於不肯定後面的0是內容仍是內容結束符。只要用到padding,那麼就要佔用實際的明文長度,因而纔有117字節的說法。咱們通常使用的padding標準有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建議的padding就佔用了11個字節。若是大於這個長度怎麼辦?不少算法的padding每每是在後邊的,但PKCS的padding則是在前面的,此爲有意設計,有意的把第一個字節置0以確保m的值小於n。這樣,128字節(1024bits)-減去11字節正好是117字節,但對於RSA加密來說,padding也是參與加密的,因此,依然按照1024bits去理解,但實際的明文只有117字節了。設計
C#代碼實現:code
RSA 填充模式:PKCS1PADDING
分片大小: 加密24四、解密256xml
internal static string GetEncryptedMsg(string xml) { byte[] encryptedData; using (var rsa = GetPublicKey(Configs.PublicKeyFilePath)) { var plainData = Encoding.UTF8.GetBytes(xml); using (var plaiStream = new MemoryStream(plainData)) { using (var crypStream = new MemoryStream()) { var offSet = 0; var inputLen = plainData.Length; for (var i = 0; inputLen - offSet > 0; offSet = i*244) { if (inputLen - offSet > 244) { var buffer = new Byte[244]; plaiStream.Read(buffer, 0, 244); var cryptograph = rsa.Encrypt(buffer, false); crypStream.Write(cryptograph, 0, cryptograph.Length); } else { var buffer = new Byte[inputLen - offSet]; plaiStream.Read(buffer, 0, inputLen - offSet); var cryptograph = rsa.Encrypt(buffer, false); crypStream.Write(cryptograph, 0, cryptograph.Length); } ++i; } crypStream.Position = 0; encryptedData = crypStream.ToBytes(); } } } return BitConverter.ToString(encryptedData).Replace("-", string.Empty); } internal static byte[] GetDecryptedMsg(byte[] encryptedBytes) { using (var rsa = GetPrivateKey(Configs.PrivateKeyFilePath, Configs.PrivateKeyPasswd)) { byte[] decryptedData; using (var plaiStream = new MemoryStream(encryptedBytes)) { using (var decrypStream = new MemoryStream()) { var offSet = 0; var inputLen = encryptedBytes.Length; for (var i = 0; inputLen - offSet > 0; offSet = i * 256) { if (inputLen - offSet > 256) { var buffer = new Byte[256]; plaiStream.Read(buffer, 0, 256); var decrypData = rsa.Decrypt(buffer, false); decrypStream.Write(decrypData, 0, decrypData.Length); } else { var buffer = new Byte[inputLen - offSet]; plaiStream.Read(buffer, 0, inputLen - offSet); var decrypData = rsa.Decrypt(buffer, false); decrypStream.Write(decrypData, 0, decrypData.Length); } ++i; } decrypStream.Position = 0; decryptedData = decrypStream.ToBytes(); } } return decryptedData; } }