Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор  [new]
Андрей Усачёв
Member

Откуда: Рига, Латвия
Сообщений: 114
Без добавления лишней нечётной дешифрации общий результат не совпадает с оригиналом.
При её добавлении -- добавленные фиктивные вызовы № 1, 3, 5 и т. д. возвращают соответственно {}, {мусор}, {мусор} и т. д.
Почему так происходит?
CryptoStream не предлагать.

Imports System.Security
Imports System.Text

Module Module1

    Sub Main()
        Dim Server As New Cryptography.AesCryptoServiceProvider ' TripleDESCryptoServiceProvider ' does not work either
        Dim Client As New Cryptography.AesCryptoServiceProvider ' TripleDESCryptoServiceProvider ' does not work either

        Server.GenerateKey()
        Server.GenerateIV()
        Client.Key = Server.Key
        Client.IV = Server.IV
        ' AES2 = AES1 ' does not work either

        Dim Encryptor As Cryptography.ICryptoTransform = Server.CreateEncryptor
        Dim Decryptor As Cryptography.ICryptoTransform = Client.CreateDecryptor

        Dim SourceText As String = "One two three four five size seven eight nine ten eleven twelve." ' 64 ASCII characters
        Dim SourceBytes(0 To SourceText.Length - 1) As Byte
        Dim EncodedBytes(0 To SourceText.Length - 1) As Byte
        Dim DecodedBytes(0 To SourceText.Length - 1) As Byte
        Dim DecodedText As String

        Dim BytesProcessed As Integer
        Dim i As Integer

        Encoding.ASCII.GetBytes(SourceText, 0, SourceText.Length, SourceBytes, 0)

        i = 0

        Do While i < SourceBytes.Length
            BytesProcessed = Encryptor.TransformBlock(SourceBytes, i, Encryptor.InputBlockSize, EncodedBytes, i)
            Debug.WriteLine("Bytes encrypted: " & BytesProcessed)
            i = i + BytesProcessed
        Loop

        i = 0

        Do While i < EncodedBytes.Length
            BytesProcessed = Decryptor.TransformBlock(EncodedBytes, i, Decryptor.InputBlockSize, DecodedBytes, i)
            ' Why the hell the 1st decryption returns 0, but the 3th, 5th and so on return rubbish?
            ' When the line above is commented, the decryption result differs from the source
            BytesProcessed = Decryptor.TransformBlock(EncodedBytes, i, Decryptor.InputBlockSize, DecodedBytes, i)
            Debug.WriteLine("Bytes decrypted: " & BytesProcessed)
            i = i + BytesProcessed
        Loop

        DecodedText = Encoding.ASCII.GetString(DecodedBytes, 0, 64)

        Debug.WriteLine("Source: " & SourceText)
        Debug.WriteLine("Decoded: " & DecodedText)
        Debug.WriteLine("---")
    End Sub

End Module


Вывод без фиктивной дешифрации (мусор каждый раз разный)
Bytes encrypted: 16
Bytes encrypted: 16
Bytes encrypted: 16
Bytes encrypted: 16
Bytes decrypted: 0
Bytes decrypted: 16
Bytes decrypted: 16
Bytes decrypted: 16
Bytes decrypted: 16
Source: One two three four five size seven eight nine ten eleven twelve.
Decoded: One two three foxS??K??S2J???NUur five size seven eight nine te


Вывод с фиктивной дешифрацией
Bytes encrypted: 16
Bytes encrypted: 16
Bytes encrypted: 16
Bytes encrypted: 16
Bytes decrypted: 16
Bytes decrypted: 16
Bytes decrypted: 16
Bytes decrypted: 16
Source: One two three four five size seven eight nine ten eleven twelve.
Decoded: One two three four five size seven eight nine ten eleven twelve.
23 сен 17, 07:00    [20817705]     Ответить | Цитировать Сообщить модератору
 Re: Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 3363
Андрей Усачёв
CryptoStream не предлагать.

Ох уж эти изобретатели велосипедов...
Информация к размышлению:
var server = new AesCryptoServiceProvider();
server.GenerateKey();
server.GenerateIV();
Console.WriteLine(server.Mode);
Console.WriteLine(server.Padding);
var encryptor = server.CreateEncryptor();
byte[] decodedBytes;
using (var ms = new MemoryStream())
{
  using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
  using (var sw = new BinaryWriter(cs))
  {
    sw.Write(Encoding.ASCII.GetBytes("One two three four five size seven eight nine ten eleven twelve.".ToCharArray()));
    sw.Flush();
    ms.Position = 0;
    decodedBytes = ms.ToArray();
  }
}
Console.WriteLine(decodedBytes.Length);

Выводит CBC, PKCS7, и почему-то 80, а не 64. Почему? Слово padding вам о чем-нибудь говорит? Это дополнение различным способом - в зависимости от режима паддинга - результирующих данных байтами в размере, кратному размеру выходного блока (подробности в гугле). Причем это дополнение делается, даже если суммарный размер закриптованных данных кратен размеру выходного блока. И этот блок с паддингом пишется при вызове CryptoStream.FlushFinalBlock, который вызывается из CryptoStream.Close, который вызывается из Close/Dispose underlying stream. А в CryptoStream.FlushFinalBlock вызывается ICryptoTransform.TransformFinalBlock. А поскольку у AesCryptoServiceProvider по умолчанию Padding=PKCS7 (дополнение байтами, каждый из которых равен количеству дополненных байтов), то вам надо считать блоки, и на последнем вызывать не TransformBlock, а TransformFinalBlock (и учесть, что размер остатка может быть не кратен размеру блока). Аналогично и с декриптованием. А первый вызов при декриптовании возвращает 0 потому, что при первом вызове TransformBlock декриптует данные паддинга, а они никакой исходной информации не содержат.
CryptoStream все эти нюансы содержит внутри себя, и избавляет от лишней мороки.
Ну, а ваш пример в приведенном виде будет работать при AesCryptoServiceProvider.Mode = CipherMode.CFB и AesCryptoServiceProvider.Padding = PaddingMode.None (и у сервера, и у клиента, разумеется) - при этом длина сообщения не меняется, и блок с паддингом не пишется.
23 сен 17, 13:52    [20817965]     Ответить | Цитировать Сообщить модератору
 Re: Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор  [new]
Андрей Усачёв
Member

Откуда: Рига, Латвия
Сообщений: 114
Сон Веры Павловны
Ох уж эти изобретатели велосипедов...

Сон Веры Павловны
вам о чем-нибудь говорит?

Ох уж эти хамы!

Сон Веры Павловны
Андрей Усачёв
CryptoStream не предлагать.

Информация к размышлению:

Не умеющие читать...

Сон Веры Павловны
(подробности в гугле)

Я спросил тут именно потому, чёрт побери, что устал искать в Гугле.
К сожалению, раньше у Майкрософта были более подробные хелпы, чем этот:
https://msdn.microsoft.com/en-us/library/system.security.cryptography.icryptotransform.transformblock(v=vs.110).aspx
К сожалению, теперь это не так, и приходится копаться в гуглопомойке.

Из того, что я прочёл в официальной документации, я сделал вывод, что шифрация и дешифрация абсолютно симметричны, и если при шифрации заполнение не создаётся при вызове TransformBlock, а при вызове TransformFinalBlock создаётся, то и при дешифрации оно должно не обрабатываться при вызове TransformBlock, а при вызове TransformFinalBlock обрабатываться. Разве это не логично?

Сон Веры Павловны
И этот блок с паддингом пишется при вызове CryptoStream.FlushFinalBlock

Я же, чёрт побери, просил не писать мне о CryptoStream.
С самого начала просил!
Надо было добавить "И не спрашивать почему и менторским тоном не просить поменять своё мнение"?!

Сон Веры Павловны
Ну, а ваш пример в приведенном виде будет работать при AesCryptoServiceProvider.Mode = CipherMode.CFB и AesCryptoServiceProvider.Padding = PaddingMode.None (и у сервера, и у клиента, разумеется) - при этом длина сообщения не меняется, и блок с паддингом не пишется.

Почему вы не могли ограничиться ТОЛЬКО этим?
Спасибо большое.

P. S. Кстати, мне показалось, что "AesCryptoServiceProvider.Mode = CipherMode.CFB" это лишнее. Заглянул в документацию, убрал из кода -- действительно, лишнее.
24 сен 17, 12:21    [20818818]     Ответить | Цитировать Сообщить модератору
 Re: Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 3363
Андрей Усачёв
Я же, чёрт побери, просил не писать мне о CryptoStream.
С самого начала просил!

У вас идиосинкразия на почве CryptoStream? Я вовсе не предлагал Вам его использовать - я лишь на его примере показал, что происходит внутри при правильном криптовании. И, кстати, эта информация не является секретной - это всё видно в исходниках (спокойно) CryptoStream.
24 сен 17, 12:35    [20818824]     Ответить | Цитировать Сообщить модератору
 Re: Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор  [new]
Андрей Усачёв
Member

Откуда: Рига, Латвия
Сообщений: 114
Сон Веры Павловны
У вас идиосинкразия на почве CryptoStream?

А у вас ананкастное расстройство?

Сон Веры Павловны
Я вовсе не предлагал Вам его использовать - я лишь на его примере показал, что происходит внутри при правильном криптовании.

О том, зачем нужен CryptoStream и что в нём происходит, я догадывался до создания этой темы. Ваше объяснение о CryptoStream полностью совпало с моими догадками. Если вам интересно, то одной из причин, почему я не использую CryptoStream, является то, что я декодирую данные прямо в том буфере, куда они поступают в закодированном виде.

Сон Веры Павловны
И, кстати, эта информация не является секретной - это всё видно в исходниках (спокойно) CryptoStream.

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

Ещё раз повторю: огромное спасибо вам за то, что вы подсказали мне нужное свойство и нужное его значение.
24 сен 17, 14:41    [20818881]     Ответить | Цитировать Сообщить модератору
 Re: Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 3363
Андрей Усачёв
Сон Веры Павловны
У вас идиосинкразия на почве CryptoStream?

А у вас ананкастное расстройство?

Нет, у меня циклотимия, и на фазе угнетения я ищу причины поступков людей.
Вопрос только в необходимом для этого времени

http://referencesource.microsoft.com - все исходники фреймворка. В т.ч. internal и private классов.
и в целесообразности

Ну, не нужно, так не нужно, не ищите. В конце концов, "кто хочет, тот ищет возможности, кто не хочет — ищет причины" (с).
24 сен 17, 16:44    [20819011]     Ответить | Цитировать Сообщить модератору
 Re: Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор  [new]
Андрей Усачёв
Member

Откуда: Рига, Латвия
Сообщений: 114
Горшочек, не вари! (с)
25 сен 17, 09:47    [20819775]     Ответить | Цитировать Сообщить модератору
 Re: Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1462
Ближе к концу темы стало интеренсо читать, обсуждение стало "какбы" живее
25 сен 17, 11:25    [20820060]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить