2016-09-04 17 views
0

私はしばらくの間探しましたが、この問題の解決策は見つかりませんでした。私は暗号化されたデータを復号化するためにBCryptDecryptを使用していますが、EncryptedDataのサイズが必要です。サイズを知らずにどのように復号化できますか?C++ - 暗号化のサイズを使わないで復号化

私はBCryptEncryptがデータを暗号化した後の長さを知っています。暗号化されたデータ/ IVでどのように送信できるかを知る唯一の方法です。

たとえば、データを暗号化し、IVを持つソケットを介してデータを復号化するWinSockサーバーに送信するとします。そのサーバはサイズを知らずにそれをどのように復号化することができますか?キーとIVを知っているにもかかわらず。

おかげ

+2

ドキュメントは何を表していますか?どのようなコードを使用していますか? – tadman

+1

暗号化されたデータを送信する場合は、長さも送信する必要があります。 (とにかくソケット通信でこれを行う必要があります。そうしないと、受信者はパケットがいつ完了するかを知らないでしょう) –

+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

私はそれをテストするためにワイヤーを介して明示的に送信しました。完全に動作しました。私はどのように送信したかを示しますが、 formatingのような。ありがとう。 –