2016-09-04 2 views
0

Я искал какое-то время, и я не нашел решение этой проблемы. Я использую BCryptDecrypt для дешифрования моих зашифрованных данных, но для этого требуется размер EncryptedData. Как вы можете расшифровывать, не зная размер?C++ - Расшифровка без размера шифрования

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

Например: предположим, что я должен зашифровать данные, а затем отправить их через сокет с IV на мой сервер WinSock, который расшифрует данные. Как этот сервер сможет расшифровать его, не зная размер? даже если он знает Ключ и IV.

Благодаря

+2

Что говорит документация? Какой код вы используете? – tadman

+1

При отправке зашифрованных данных вы также должны отправить длину. (Вы должны сделать это в любом случае с помощью comm comms, иначе получатель не узнает, когда пакет будет завершен) –

+0

Вам просто нужно реализовать заполнение данных, которые нужно зашифровать. Он позволяет восстановить исходную длину потока после дешифрования. См. Https://en.wikipedia.org/wiki/Padding_(cryptography) для получения более подробной информации – Serge

ответ

0

Если размер не требуется, я вижу два пути, чтобы получить его:

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

С первых, вы могли бы попробовать что-то вроде этого:

<number of bytes to follow><separator symbol><message data> 

Второй требует, чтобы вы смогли обнаружить конец сообщения правильно. Вы можете обнаружить это через определенные последовательности сообщений. Затем, однако, вам нужно избежать такой последовательности в сообщении, если оно появится. Что-то похожее на то, как символы экранируются в C/C++/Java/C# ... Если не использовать первый подход, который мне кажется самым простым, это то, что я бы предпочел бы против варианта ниже ...

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

Можно даже сочетать оба подхода:

<message start sequence> 
<number of bytes to follow> 
<separator symbol> 
<encrypted data> 
<message end sequence> 

Как последовательность запуска сообщения, так и последовательность сообщений должны быть экранированы. Если вы обнаружите последовательность запуска сообщения, то в зашифрованных данных или в конце последовательности сообщений до того, как количество байтов было прочитано, вы знаете на стороне сервера, что что-то пошло не так ...

+0

Я отправил его явно через провод, чтобы проверить его, и он отлично работал, я бы показал, как я его отправил, но комментарии не кажутся как формирование. Благодарю. –

Смежные вопросы