I'm a noob and I'm trying to work with some encryption/decryption of data. It was some hard work for me to get it working with some buffers and what not.
public static string Encrypt(string dataToEncrypt, byte[] publicKeyInfo)
{
//// Our bytearray to hold all of our data after the encryption
byte[] encryptedBytes = new byte[0];
using (var rsa = new RSACryptoServiceProvider())
{
//// Our bytearray to hold all of our data after the encryption
byte[] encryptedBytes = new byte[0];
using (var rsa = new RSACryptoServiceProvider())try
{
try
{
var encoder = new UTF8Encoding();
byte[] encryptThis = encoder.GetBytes(dataToEncrypt);
//// Importing the public key
rsa.ImportCspBlob(publicKeyInfo);
int blockSize = (rsa.KeySize / 8) - 32;
//// buffer to write byte sequence of the given block_size
byte[] buffer = new byte[blockSize];
byte[] encryptedBuffer = new byte[blockSize];
//// Initializing our encryptedBytes array to a suitable size, depending on the size of data to be encrypted
encryptedBytes = new byte[encryptThis.Length + blockSize - (encryptThis.Length % blockSize) + 32];
for (int i = 0; i < encryptThis.Length; i += blockSize)
{
//// If there is extra info to be parsed, but not enough to fill out a complete bytearray, fit array for last bit of data
if (2 * i > encryptThis.Length && ((encryptThis.Length - i) % blockSize != 0))
{
//// If there is extra info to be parsed, but not enough to fill out a complete bytearray, fit array for last bit of data
if (2 * i > encryptThis.Length && ((encryptThis.Length - i) % blockSize != 0))
{
buffer = new byte[encryptThis.Length - i];
blockSize = encryptThis.Length - i;
}
//// If the amount of bytes we need to decrypt isn't enough to fill out a block, only decrypt part of it
if (encryptThis.Length < blockSize)
{
buffer = new byte[encryptThis.Length];
blockSize = encryptThis.Length;
}
//// encryptIf the specified sizeamount of data,bytes thenwe addneed to finaldecrypt array.
isn't enough to fill out a block, only decrypt part of it
Buffer.BlockCopy(encryptThis, i, buffer, 0, if (encryptThis.Length < blockSize);
{
encryptedBuffer = rsa.Encrypt( buffer, false);= new byte[encryptThis.Length];
encryptedBuffer.CopyTo(encryptedBytes,blockSize i);= encryptThis.Length;
}
}
catch (CryptographicException e)
{
//// encrypt the specified size of data, then add to final Consolearray.Write(e);
}
finally
Buffer.BlockCopy(encryptThis, i, buffer, 0, {blockSize);
//// Clear the RSAencryptedBuffer key= containerrsa.Encrypt(buffer, deleting generated keys.false);
rsaencryptedBuffer.PersistKeyInCsp =CopyTo(encryptedBytes, false;i);
}
}
catch (CryptographicException e)
{
Console.Write(e);
}
finally
{
//// ConvertClear the byteArrayRSA usingkey Base64container, anddeleting returnsgenerated askeys.
an encrypted string
return Convertrsa.ToBase64String(encryptedBytes);PersistKeyInCsp = false;
}
}
//// Convert the byteArray using Base64 and returns as an encrypted string
return Convert.ToBase64String(encryptedBytes);
}
public static string Decrypt(string dataToDecrypt, byte[] privateKeyInfo)
{
//// The bytearray to hold all of our data after decryption
byte[] decryptedBytes;
public static string Decrypt(string dataToDecrypt, byte[] privateKeyInfo)
{
//// The bytearray to hold all of our data after decryption
byte[] decryptedBytes;
//Create a new instance of RSACryptoServiceProvider.
using (var rsa = new RSACryptoServiceProvider())
{
try
{
try
{
byte[] bytesToDecrypt = Convert.FromBase64String(dataToDecrypt);
//// Import the private key info
rsa.ImportCspBlob(privateKeyInfo);
//// No need to subtract padding size when decrypting
int blockSize = rsa.KeySize / 8;
//// buffer to write byte sequence of the given block_size
byte[] buffer = new byte[blockSize];
//// buffer containing decrypted information
byte[] decryptedBuffer = new byte[blockSize];
//// Initializes our array to make sure it can hold at least the amount needed to decrypt.
decryptedBytes = new byte[dataToDecrypt.Length];
for (int i = 0; i < bytesToDecrypt.Length; i += blockSize)
{
if (2 * i > bytesToDecrypt.Length && ((bytesToDecrypt.Length - i) % blockSize != 0))
{
if (2 * i > bytesToDecrypt.Length && ((bytesToDecrypt.Length - i) % blockSize != 0))
{
buffer = new byte[bytesToDecrypt.Length - i];
blockSize = bytesToDecrypt.Length - i;
}
//// If the amount of bytes we need to decrypt isn't enough to fill out a block, only decrypt part of it
if (bytesToDecrypt.Length < blockSize)
{
buffer = new byte[bytesToDecrypt.Length];
blockSize = bytesToDecrypt.Length;
}
//// If the amount Buffer.BlockCopy(bytesToDecrypt,of i,bytes buffer,we 0need to decrypt isn't enough to fill out a block, only decrypt part of it
if (bytesToDecrypt.Length < blockSize);
{
decryptedBuffer = rsa.Decrypt( buffer, false);= new byte[bytesToDecrypt.Length];
decryptedBuffer.CopyTo(decryptedBytes,blockSize i);= bytesToDecrypt.Length;
}
}
finally
Buffer.BlockCopy(bytesToDecrypt, i, buffer, 0, {blockSize);
//// Clear the RSAdecryptedBuffer key= containerrsa.Decrypt(buffer, deleting generated keys.false);
rsadecryptedBuffer.PersistKeyInCsp =CopyTo(decryptedBytes, false;i);
}
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
//// We encode each byte with UTF8 and then write to a string while trimming off the extra empty data created by the overhead.
var encoder = new UTF8Encoding();
return encoder.GetString(decryptedBytes).TrimEnd(new[] { '\0' });
}
I tried to see if I could split it up, but in my effort to do so, I came up with what I believed would be a more complex method (higher cyclomatic complexity) since I had a lot of if statements all of the sudden, having to take care of the encryption mode but also handling the encoding from UTF8 or BASE64.
Any help will be greatly appreciatedI tried to see if I could split it up, thank you very muchbut in advancemy effort to do so, I came up with what I believed would be a more complex method (higher cyclomatic complexity). I had a lot of if
statements all of the sudden, having to take care of the encryption mode but also handling the encoding from UTF8 or BASE64.