Мне сложно понять, что здесь происходит. Приведенный ниже код преобразует байтовый массив с помощью шифровальщика и преобразует его обратно с помощью дешифратора. Но первый вызов TransformBlock ничего не делает, а второй заполняет правильные значения. Есть идеи, что я делаю не так, пожалуйста?
Random random = new Random();
ICryptoTransform encryptor, decryptor;
byte[] key = new byte[16];
byte[] iv = new byte[8];
random.NextBytes(key);
random.NextBytes(iv);
TripleDESCryptoServiceProvider tripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider();
encryptor = tripleDESCryptoServiceProvider.CreateEncryptor(key, iv);
decryptor = tripleDESCryptoServiceProvider.CreateDecryptor(key, iv);
byte[] data = new byte[8];
random.NextBytes(data);
byte[] crypted = new byte[8];
byte[] decrypted = new byte[8];
encryptor.TransformBlock(data, 0, 8, crypted, 0);
decryptor.TransformBlock(crypted, 0, 8, decrypted, 0);
decryptor.TransformBlock(crypted, 0, 8, decrypted, 0);
Я пробовал это: byte [] crypted = encryptor.TransformFinalBlock (data, 0, 8); byte [] decrypted = decryptor.TransformFinalBlock (зашифровано, 0, 8); Но я получаю исключение из-за неверных данных
Это правильно. Режим CBC, установленный по умолчанию, всегда дополняет, поэтому вы получаете взамен 16 байт.
Есть ли способ избежать этого?
Черт, должно было быть это да. Вот и шутка. Как дела?
Я нашел здесь этот код, кажется, работает, но я не могу понять, что он делает: rextester.com/discussion/QSX88021/Des-encryption
Просмотр случайного кода шифрования, найденного в Интернете, является информативным никогда, если он не является частью конкретного ответа или если он используется в качестве демонстрации концепции. Даже не ходи туда. Вы уже используете тройной DES и CBC, что не является хорошим знаком.
Вы пробовали корректировать свой код с помощью PaddingMode.None?
@MaartenBodewes Это действительно решило проблему, большое вам спасибо. Вы хотите выразить это как ответ?
Нет, я рад, что вы его решили, но я думаю, что это больше отладка, чем что-либо еще, и на исходный вопрос, несомненно, уже есть ответ, скажем ... этот.





Да, вместо этого используйте
TransformFinalBlock. Без него код не знает, нужно ли распаковывать блокировку, и оставляет байты во внутреннем буфере.