1

VB.NETのAESManagedまたはRijndaelManagedを使用してデータを復号化および暗号化しようとしています。サイズがブロックサイズの倍数ではないデータパケットがあります。この場合、復号化しようとすると「復号化するデータの長さが無効です」というエラーが表示されます。データの最後にある不足しているブロックを削除した場合にのみ、復号化できます。しかし、私は最後のブロックに何があるかを知る必要があります。

それで

ブロックサイズの倍数ではないサイズのデータ​​を復号化することは可能ですか?

もしそうなら、どうすればそれを行うことができますか?

編集:

書き忘れた情報がいくつかあります。

ブロック暗号モードはCBCである必要があります。最後のバイトを除くすべてのデータを正常に復号化できるためです。

データ全体を復号化できるクライアントがあります。復号化機能のasmコードを見つけました。私がそれを正しく理解している場合、それは次のように機能します:

x =不十分なブロックサイズ(x <16)

buffer =(16 + x)のサイズの配列

  • 最初に、関数は前の復号化されていないバイトを取得し、それをバッファーの最初の16バイトに配置します。(16バイト)
  • 復号化されていない最後のバイトをバッファに追加します。(xバイト)
  • buffer [x]からバッファの最後まで復号化し、結果を同じ場所に配置します。(バッファの最後の16バイト)
  • buffer[0]からbuffer[15]に復号化し、結果を同じ場所に配置します。(バッファの最初の16バイト)
  • ご存知のように、CBCは復号化されたバイトを以前の復号化されたバイトと排他的論理和します。したがって、関数は最初のxバイトのバッファーと最後のxバイトのバッファーを排他的論理和します。

.NETでこのように最後のバイトを復号化する方法はありますか?

4

1 に答える 1

2

アップデート:

暗号文を盗む CBC モードがある場合、cbc の実装だけで cbc-ctsを実装することができます。

オリジナル:

すべてのデータ パケットが暗号文であることを確認してください。ヘッダーまたは長さと復号化アルゴリズムを通過できる何かがプレフィックスとして付けられている場合、プレフィックス付きのデータについて文句を言うことはなく、最後に到達する前にジャンクに復号化し、パディングについて文句を言うだけです。

また、認証された暗号化を使用している場合、暗号文を mac で後置することも一般的です。これにより、ブロックサイズ以外の長さの倍数が得られますが、その場合は、最後の x バイトを読み取って暗号文を認証する必要があります (一般的に使用されるのはHMAC ) を解読する前に。

また、暗号文のソースと一致する適切な AES モードを使用していることを確認してください。ブロックサイズの倍数を必要としない AES のモードがいくつかありますが、それらは通常、組み込みの .net 暗号化ではサポートされていません。

于 2013-03-08T13:37:00.640 に答える