国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# RSA分段加解密實現方法詳解

2019-10-29 21:11:47
字體:
來源:轉載
供稿:網友

本文實例講述了C# RSA分段加解密實現方法。分享給大家供大家參考,具體如下:

RSA加解密:

1024位的證書,加密時最大支持117個字節,解密時為128;

2048位的證書,加密時最大支持245個字節,解密時為256。

加密時支持的最大字節數:證書位數/8 -11(比如:2048位的證書,支持的最大加密字節數:2048/8 - 11 = 245)

.NET中的RSA加密算法為了提高安全性,在待加密數據前要添加一些隨機數,因此,使用.NET中的RSA加密算法一次最多加密117字節數據(多于117字節需要拆分成多段分別加密再連接起來),經過加密后得到一個長度為128字節的加密數據。

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#代碼實現:

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;  }}

希望本文所述對大家C#程序設計有所幫助。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 岐山县| 吉木乃县| 方山县| 陕西省| 舟山市| 磐安县| 屏东县| 鄂尔多斯市| 东明县| 郴州市| 商洛市| 和林格尔县| 巴东县| 辰溪县| 珠海市| 固始县| 西安市| 当阳市| 库尔勒市| 唐山市| 泸水县| 本溪| 嘉峪关市| 平罗县| 峡江县| 吴堡县| 阿荣旗| 凤台县| 恩施市| 嘉鱼县| 金沙县| 昌都县| 资兴市| 枞阳县| 区。| 杭州市| 汝城县| 阳谷县| 衡阳市| 舒城县| 长治县|