С# расшифровка AESC#

Место общения программистов C#
Anonymous
С# расшифровка AES

Сообщение Anonymous »

Я работаю с формами SagePay и в настоящее время конвертирую имеющиеся у них примеры VB в C#. Я добился хорошего прогресса, поэтому часть шифрования моего проекта работает нормально (SagePay может ее расшифровать).

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь расшифровать строку , оно превращается в мусор. Если кто-нибудь делал это раньше, я был бы очень признателен за помощь с моим кодом расшифровки. Я включил работающий код шифрования, а первые две строки — это настройка и вызов другого метода.

Я не добавлял код VB, но если это необходимо, я могу его добавить. Не хотелось бы писать огромный пост, если в этом нет необходимости.

Вспомогательные методы:

public string byteArrayToHexString(byte[] ba)
{
return BitConverter.ToString(ba).Replace("-", "");
}

public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}


Основной метод шифрования, первые несколько строк которого представляют собой его вызов, извлеченный из более крупного метода.

string crypt = "blahblahblah"
string EncryptAndEncode = "@" + byteArrayToHexString(aesEncrypt(crypt));

private byte[] aesEncrypt(string inputText)
{

RijndaelManaged AES = new RijndaelManaged();

//set the mode, padding and block size for the key
AES.Padding = PaddingMode.PKCS7;
AES.Mode = CipherMode.CBC;
AES.KeySize = 128;
AES.BlockSize = 128;

//convert key and plain text input into byte arrays
Byte[] keyAndIvBytes = UTF8Encoding.UTF8.GetBytes("tR7nR6wZHGjYMCuV");
Byte[] inputBytes = UTF8Encoding.UTF8.GetBytes(inputText);//AbHLlc5uLone0D1q

//create streams and encryptor object
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, AES.CreateEncryptor(keyAndIvBytes, keyAndIvBytes), CryptoStreamMode.Write);

//perform encryption
cryptoStream.Write(inputBytes, 0, inputBytes.Length);
cryptoStream.FlushFinalBlock();

//get encrypted stream into byte array
Byte[] outBytes = memoryStream.ToArray();

//close streams
memoryStream.Close();
cryptoStream.Close();
AES.Clear();

return outBytes;
}


Методы декодирования и расшифровки

public string DecodeAndDecrypt(string strIn)
{
//** HEX decoding then AES decryption, CBC blocking with PKCS5 padding - DEFAULT **

string DecodeAndDecrypt = aesDecrypt(StringToByteArray(strIn.Substring(1)));
return (DecodeAndDecrypt);
}

private string aesDecrypt(Byte[] inputBytes)
{
RijndaelManaged AES = new RijndaelManaged();
Byte[] keyAndIvBytes = UTF8Encoding.UTF8.GetBytes("tR7nR6wZHGjYMCuV");
Byte[] outputBytes = inputBytes;//Convert.FromBase64String(inputBytes);

//set the mode, padding and block size
AES.Padding = PaddingMode.PKCS7;
AES.Mode = CipherMode.CBC;
AES.KeySize = 128;
AES.BlockSize = 128;

//create streams and decryptor object
MemoryStream memoryStream = new MemoryStream(outputBytes);
CryptoStream cryptoStream = new CryptoStream(memoryStream, AES.CreateEncryptor(keyAndIvBytes, keyAndIvBytes), CryptoStreamMode.Read);
//perform decryption
cryptoStream.Read(outputBytes, 0, outputBytes.Length);
Trace.WriteLine(outputBytes);
//close streams
memoryStream.Close();
cryptoStream.Close();
AES.Clear();
//return System.Text.Encoding.UTF8.GetString(outputBytes);

string plainText = Encoding.UTF8.GetString(outputBytes,
0,
outputBytes.Length);

return plainText;
}


Подробнее здесь: https://stackoverflow.com/questions/175 ... decryption

Вернуться в «C#»