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

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

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
主站蜘蛛池模板: 91精品啪在线观看国产老湿机 | 国产精品怡红院永久免费 | 麻豆在线传煤 | 校园纯肉H教室第一次 | 精品一区二区三区波多野结衣 | 免费全看男女拍拍拍的视频 | 日本福利视频网站 | 美女露奶奶 | 女人c交zzzooo在线观看 | 四虎永久免费地址ww417 | 日韩 视频在线播放 | 亚洲国产精品久久久久久 | www.99热 | 国产精品免费精品自在线观看 | 久久99r66热这里只有精品 | 国产日韩欧美成人 | 百合互慰吃奶互揉漫画 | 免费在线视频成人 | 黑人biglackon10十| 天使萌痴汉在线中文字幕 | 香蕉久久久久久狠狠色 | 天选之王漫画顾长歌免费阅读 | 校园全肉高h湿一女多男 | 日韩国产欧美精品综合二区 | 欧美国产日本精品一区二区三区 | 天堂a免费视频在线观看 | 免费二级毛片免费完整视频 | 精品无人区乱码1区2区3区在线 | 摄像头东北对白清晰 | 369手机看片| 亚洲国产成人精品激情 | 视频大全在线观看免费 | chinaese中国女人厕所小便 | 色综合天天网 | 满溢游泳池免费土豪全集下拉版 | 久草在在线免视频在线观看 | 女人国产香蕉久久精品 | 精品午夜视频 | a毛片免费全部在线播放毛 a级在线看 | 冰漪丰满大乳人体图片欣赏 | 国产精品视频一区二区三区 |