一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C# RSA分段加解密實現方法詳解

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

2021-12-30 14:50FrankYou C#

這篇文章主要介紹了C# RSA分段加解密實現方法,結合具體實例形式分析了C# RSA加密解密的原理與具體實現技巧,需要的朋友可以參考下

本文實例講述了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#代碼實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
主站蜘蛛池模板: 亚洲国产美女精品久久 | 欧美国产精品 | 日韩一级片在线播放 | 国产精品免费看香蕉 | 99re精品在线 | 国产一区二区在线看 | 国产一成人精品福利网站 | 国产 日韩 一区 | 西西人体大胆啪啪私拍色约约 | 日韩在线观看网站 | 精品久久久久香蕉网 | 国产视频一区在线观看 | 美女大鸡鸡 | 亚洲黄色成人 | 亚洲视频一区网站 | 91sao在线看片水片 | 日韩精选视频 | 亚洲男女在线 | www亚洲精品| 国产女乱淫真高清免费视频 | 国产精品二区高清在线 | 母乳在线播放 | 免费一级片在线观看 | 亚洲第一色网 | 国内精品伊人久久大香线焦 | 精品一区二区三区免费视频 | 思思99热久久精品在2019线 | 久久这里只有精品视频9 | 扒开黑女人p大荫蒂老女人 扒开大腿狠狠挺进视频 | 亚洲卡一卡2卡三卡4麻豆 | 欧美操屁股 | 楚乔传第二部免费观看全集完整版 | 成人伊人青草久久综合网破解版 | 国产在线精品99一卡2卡 | 星星动漫在线观看无删减 | 亚洲欧美日韩精品高清 | 国产精品免费看久久久香蕉 | 亚洲精品成人a | 青青在线观看视频 | 欧美久久久久久久一区二区三区 | 5566中文字幕亚洲精品 |