Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class RSA3072 : IDisposable
- {
- internal readonly RSACng Cryptor;
- public RSA3072() => Cryptor = new RSACng(3072);
- public RSA3072(byte[] paramBytes)
- {
- RSAParameters rsaPar = new RSAParameters();
- if (paramBytes.Length > 1728)
- {
- rsaPar.D = new byte[384];
- Array.Copy(paramBytes, 0, rsaPar.D, 0, 384);
- rsaPar.P = new byte[192];
- Array.Copy(paramBytes, 384, rsaPar.P, 0, 192);
- rsaPar.Q = new byte[192];
- Array.Copy(paramBytes, 576, rsaPar.Q, 0, 192);
- rsaPar.DP = new byte[192];
- Array.Copy(paramBytes, 768, rsaPar.DP, 0, 192);
- rsaPar.DQ = new byte[192];
- Array.Copy(paramBytes, 960, rsaPar.DQ, 0, 192);
- rsaPar.InverseQ = new byte[192];
- Array.Copy(paramBytes, 1152, rsaPar.InverseQ, 0, 192);
- rsaPar.Modulus = new byte[384];
- Array.Copy(paramBytes, 1344, rsaPar.Modulus, 0, 384);
- rsaPar.Exponent = new byte[paramBytes.Length - 1728];
- Array.Copy(paramBytes, 1728, rsaPar.Exponent, 0, paramBytes.Length - 1728);
- }
- else if (paramBytes.Length > 384)
- {
- rsaPar.Modulus = new byte[384];
- Array.Copy(paramBytes, 0, rsaPar.Modulus, 0, 384);
- rsaPar.Exponent = new byte[paramBytes.Length - 384];
- Array.Copy(paramBytes, 384, rsaPar.Exponent, 0, paramBytes.Length - 384);
- }
- Cryptor = new RSACng();
- Cryptor.ImportParameters(rsaPar);
- }
- public enum RSA3072Padding
- {
- PKCS1 = 0,
- SHA1 = 1,
- SHA256 = 2,
- SHA384 = 3,
- SHA512 = 4
- }
- public byte[] Encrypt(byte[] Data, RSA3072Padding padding)
- {
- int limit = 373;
- RSAEncryptionPadding pad = RSAEncryptionPadding.Pkcs1;
- switch (padding)
- {
- case RSA3072Padding.SHA1:
- limit = 342;
- pad = RSAEncryptionPadding.OaepSHA1;
- break;
- case RSA3072Padding.SHA256:
- limit = 318;
- pad = RSAEncryptionPadding.OaepSHA256;
- break;
- case RSA3072Padding.SHA384:
- limit = 286;
- pad = RSAEncryptionPadding.OaepSHA384;
- break;
- case RSA3072Padding.SHA512:
- limit = 254;
- pad = RSAEncryptionPadding.OaepSHA512;
- break;
- }
- if (Data.Length > 318)
- {
- List<byte> result = new List<byte>();
- int minRounds = Data.Length / limit;
- for (int i = 0; i < minRounds; i++) result.AddRange(Cryptor.Encrypt(Data.SubArray(i * limit, limit), pad));
- minRounds *= limit;
- result.AddRange(Cryptor.Encrypt(Data.SubArray(minRounds, Data.Length - minRounds), pad));
- return result.ToArray();
- }
- else
- {
- return Cryptor.Encrypt(Data, pad);
- }
- }
- public byte[] Decrypt(byte[] Data, RSA3072Padding padding)
- {
- RSAEncryptionPadding pad = RSAEncryptionPadding.Pkcs1;
- switch (padding)
- {
- case RSA3072Padding.SHA1:
- pad = RSAEncryptionPadding.OaepSHA1;
- break;
- case RSA3072Padding.SHA256:
- pad = RSAEncryptionPadding.OaepSHA256;
- break;
- case RSA3072Padding.SHA384:
- pad = RSAEncryptionPadding.OaepSHA384;
- break;
- case RSA3072Padding.SHA512:
- pad = RSAEncryptionPadding.OaepSHA512;
- break;
- }
- if (Data.Length > 384)
- {
- List<byte> result = new List<byte>();
- for (int i = 0; i < Data.Length; i += 384) result.AddRange(Cryptor.Decrypt(Data.SubArray(i, 384), pad));
- return result.ToArray();
- }
- else
- {
- return Cryptor.Decrypt(Data, pad);
- }
- }
- public void Dispose()
- {
- Cryptor.Dispose();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement