powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
8 сообщений из 8, страница 1 из 1
Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
    #39525196
Андрей Усачёв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без добавления лишней нечётной дешифрации общий результат не совпадает с оригиналом.
При её добавлении -- добавленные фиктивные вызовы № 1, 3, 5 и т. д. возвращают соответственно {}, {мусор}, {мусор} и т. д.
Почему так происходит?
CryptoStream не предлагать.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
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



Вывод без фиктивной дешифрации (мусор каждый раз разный)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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


Вывод с фиктивной дешифрацией
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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.
...
Рейтинг: 0 / 0
Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
    #39525273
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей УсачёвCryptoStream не предлагать.
Ох уж эти изобретатели велосипедов...
Информация к размышлению:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 (и у сервера, и у клиента, разумеется) - при этом длина сообщения не меняется, и блок с паддингом не пишется.
...
Рейтинг: 0 / 0
Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
    #39525406
Андрей Усачёв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныОх уж эти изобретатели велосипедов...

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

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

Сон Веры ПавловныАндрей Усачёв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" это лишнее. Заглянул в документацию, убрал из кода -- действительно, лишнее.
...
Рейтинг: 0 / 0
Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
    #39525407
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей УсачёвЯ же, чёрт побери, просил не писать мне о CryptoStream.
С самого начала просил!
У вас идиосинкразия на почве CryptoStream? Я вовсе не предлагал Вам его использовать - я лишь на его примере показал, что происходит внутри при правильном криптовании. И, кстати, эта информация не является секретной - это всё видно в исходниках (спокойно) CryptoStream.
...
Рейтинг: 0 / 0
Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
    #39525428
Андрей Усачёв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныУ вас идиосинкразия на почве CryptoStream?
А у вас ананкастное расстройство?

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

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

Ещё раз повторю: огромное спасибо вам за то, что вы подсказали мне нужное свойство и нужное его значение.
...
Рейтинг: 0 / 0
Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
    #39525458
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей УсачёвСон Веры ПавловныУ вас идиосинкразия на почве CryptoStream?
А у вас ананкастное расстройство?
Нет, у меня циклотимия, и на фазе угнетения я ищу причины поступков людей.
Вопрос только в необходимом для этого времени
http://referencesource.microsoft.com - все исходники фреймворка. В т.ч. internal и private классов.
и в целесообразности
Ну, не нужно, так не нужно, не ищите. В конце концов, "кто хочет, тот ищет возможности, кто не хочет — ищет причины" (с).
...
Рейтинг: 0 / 0
Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
    #39525595
Андрей Усачёв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Горшочек, не вари! (с)
...
Рейтинг: 0 / 0
Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
    #39525668
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ближе к концу темы стало интеренсо читать, обсуждение стало "какбы" живее
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Дешифрация AES: чётные вызовы работают, 1 ничего не делает, 3, 5 и т. д. возвращают мусор
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]