Advertisement
TizzyT

RSA3072 -TizzyT

Jun 24th, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.53 KB | None | 0 0
  1.     public class RSA3072 : IDisposable
  2.     {
  3.         internal readonly RSACng Cryptor;
  4.  
  5.         public RSA3072() => Cryptor = new RSACng(3072);
  6.  
  7.         public RSA3072(byte[] paramBytes)
  8.         {
  9.             RSAParameters rsaPar = new RSAParameters();
  10.             if (paramBytes.Length > 1728)
  11.             {
  12.                 rsaPar.D = new byte[384];
  13.                 Array.Copy(paramBytes, 0, rsaPar.D, 0, 384);
  14.                 rsaPar.P = new byte[192];
  15.                 Array.Copy(paramBytes, 384, rsaPar.P, 0, 192);
  16.                 rsaPar.Q = new byte[192];
  17.                 Array.Copy(paramBytes, 576, rsaPar.Q, 0, 192);
  18.                 rsaPar.DP = new byte[192];
  19.                 Array.Copy(paramBytes, 768, rsaPar.DP, 0, 192);
  20.                 rsaPar.DQ = new byte[192];
  21.                 Array.Copy(paramBytes, 960, rsaPar.DQ, 0, 192);
  22.                 rsaPar.InverseQ = new byte[192];
  23.                 Array.Copy(paramBytes, 1152, rsaPar.InverseQ, 0, 192);
  24.                 rsaPar.Modulus = new byte[384];
  25.                 Array.Copy(paramBytes, 1344, rsaPar.Modulus, 0, 384);
  26.                 rsaPar.Exponent = new byte[paramBytes.Length - 1728];
  27.                 Array.Copy(paramBytes, 1728, rsaPar.Exponent, 0, paramBytes.Length - 1728);
  28.             }
  29.             else if (paramBytes.Length > 384)
  30.             {
  31.                 rsaPar.Modulus = new byte[384];
  32.                 Array.Copy(paramBytes, 0, rsaPar.Modulus, 0, 384);
  33.                 rsaPar.Exponent = new byte[paramBytes.Length - 384];
  34.                 Array.Copy(paramBytes, 384, rsaPar.Exponent, 0, paramBytes.Length - 384);
  35.             }
  36.             Cryptor = new RSACng();
  37.             Cryptor.ImportParameters(rsaPar);
  38.         }
  39.  
  40.         public enum RSA3072Padding
  41.         {
  42.             PKCS1 = 0,
  43.             SHA1 = 1,
  44.             SHA256 = 2,
  45.             SHA384 = 3,
  46.             SHA512 = 4
  47.         }
  48.  
  49.         public byte[] Encrypt(byte[] Data, RSA3072Padding padding)
  50.         {
  51.             int limit = 373;
  52.             RSAEncryptionPadding pad = RSAEncryptionPadding.Pkcs1;
  53.             switch (padding)
  54.             {
  55.                 case RSA3072Padding.SHA1:
  56.                     limit = 342;
  57.                     pad = RSAEncryptionPadding.OaepSHA1;
  58.                     break;
  59.                 case RSA3072Padding.SHA256:
  60.                     limit = 318;
  61.                     pad = RSAEncryptionPadding.OaepSHA256;
  62.                     break;
  63.                 case RSA3072Padding.SHA384:
  64.                     limit = 286;
  65.                     pad = RSAEncryptionPadding.OaepSHA384;
  66.                     break;
  67.                 case RSA3072Padding.SHA512:
  68.                     limit = 254;
  69.                     pad = RSAEncryptionPadding.OaepSHA512;
  70.                     break;
  71.             }
  72.             if (Data.Length > 318)
  73.             {
  74.                 List<byte> result = new List<byte>();
  75.                 int minRounds = Data.Length / limit;
  76.                 for (int i = 0; i < minRounds; i++) result.AddRange(Cryptor.Encrypt(Data.SubArray(i * limit, limit), pad));
  77.                 minRounds *= limit;
  78.                 result.AddRange(Cryptor.Encrypt(Data.SubArray(minRounds, Data.Length - minRounds), pad));
  79.                 return result.ToArray();
  80.             }
  81.             else
  82.             {
  83.                 return Cryptor.Encrypt(Data, pad);
  84.             }
  85.         }
  86.  
  87.         public byte[] Decrypt(byte[] Data, RSA3072Padding padding)
  88.         {
  89.             RSAEncryptionPadding pad = RSAEncryptionPadding.Pkcs1;
  90.             switch (padding)
  91.             {
  92.                 case RSA3072Padding.SHA1:
  93.                     pad = RSAEncryptionPadding.OaepSHA1;
  94.                     break;
  95.                 case RSA3072Padding.SHA256:
  96.                     pad = RSAEncryptionPadding.OaepSHA256;
  97.                     break;
  98.                 case RSA3072Padding.SHA384:
  99.                     pad = RSAEncryptionPadding.OaepSHA384;
  100.                     break;
  101.                 case RSA3072Padding.SHA512:
  102.                     pad = RSAEncryptionPadding.OaepSHA512;
  103.                     break;
  104.             }
  105.             if (Data.Length > 384)
  106.             {
  107.                 List<byte> result = new List<byte>();
  108.                 for (int i = 0; i < Data.Length; i += 384) result.AddRange(Cryptor.Decrypt(Data.SubArray(i, 384), pad));
  109.                 return result.ToArray();
  110.             }
  111.             else
  112.             {
  113.                 return Cryptor.Decrypt(Data, pad);
  114.             }
  115.  
  116.         }
  117.  
  118.         public void Dispose()
  119.         {
  120.             Cryptor.Dispose();
  121.         }
  122.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement