質問

<!> quot; streams <!> quot;で機能する、つまりcrypt mykey <!> lt;のように使用できるXXTEA暗号化アルゴリズムの実装を書いています。 myfile <!> gt;出力。

必要条件の1つは、ファイルにまったくアクセスできないことです(EOFが見つかるまで固定サイズのブロックのみを読み取ります)。アルゴリズムでは、データバイトが4の倍数である必要があるため、パディングを追加する必要があります。

プレーンテキストの場合、適切な解決策はNULLを埋め込むことであり、復号化ではNULLを無視しますが、バイナリストリーム(埋め込みNULLを含むことができる)に同じ戦略を使用することはできません。

欠落している文字数のパディング(3文字が欠落している場合、最後に3、3、3を追加)などの一般的なソリューションを読みましたが、もっとエレガントなソリューションがあります

役に立ちましたか?

解決

質問を読むと、これのセキュリティ面は意味がないように見えます。簡単に言えば、入力として4バイトの倍数を期待するapiがありますが、これは常に持っているわけではありません。

任意のバイナリストリームに最大3バイトを追加することは、バイナリストリームが気にしないことを保証できない場合は危険です。 exeファイルには残りのすべてのビットの関連サイズを指定するヘッダーがあるため、exeファイルの末尾に0を追加しても問題ありません。 pcxファイルには、ファイルの末尾から特定のバイト数で始まるヘッダーがあるため、pcxファイルの末尾に0を追加すると破損します。

だから本当に選択肢はありません-バイナリストリームの最後で自然に発生しないことが保証されている、使用可能なマジックパディングバイトの選択肢はありません:常に少なくとも1つ追加する必要があります使用されるパディングバイトを説明する追加の情報ワード。

他のヒント

読む: http://msdn.microsoft .com / en-us / library / system.security.cryptography.paddingmode.aspx

次のような一般的なパディング方法のリストがあります:

PKCS7-PKCS#7パディング文字列は一連のバイトで構成され、各バイトは追加されたパディングバイトの総数に等しくなります。

ANSIX923のパディング文字列は、長さの前にゼロで埋められた一連のバイトで構成されます。

ISO10126パディング文字列は、長さの前のランダムデータで構成されています。

例:

生データ:01 01 01 01 01

PKCS#7:01 01 01 01 01 03 03 03

ANSIX923 01 01 01 01 01 00 00 00 03

ISO10126:01 01 01 01 01 CD A9 03

暗号文の窃盗をご覧ください。おそらく、プレーンテキストのパディングよりもはるかにエレガントです。また、4バイトよりも大きいブロックサイズを使用することをお勧めします-64ビットがおそらく最低限必要です。

厳密に言えば、日曜大工暗号化は危険なアイデアです。暗号コミュニティ全体が破ろうとして失敗したアルゴリズムに勝るものはありません。楽しんで、 this 、または少なくともSchneierの<! > quot;関連する読み物<!> quot;セクション。

実際には、優れたストリーム暗号にはパディングはまったく必要ないと思われます。たとえば、RC4はパディングを必要とせず、非常に強力なストリーム暗号です。ただし、常に同じキーを使用し、暗号化されたデータにアクセスできる暗号化ルーチンに攻撃者が異なる選択データを供給することができる場合、攻撃される可能性があります。総当たり攻撃なしで、正しい入力データを選択し、出力データを分析することで暗号化キーを復元できます。それ以外はRC4は非常に安全です。

パディングが必要な場合、ストリーム暗号はありません。 4バイトの倍数または16バイトの倍数になるようにパディングする場合、大きな違いは何ですか?また、16バイトの倍数になるようにパディングされている場合、ほとんどすべてのブロック暗号を使用できます。実際、暗号はブロック暗号であり、4バイトブロックでのみ機能します。それはすべての<!> quot; symbol <!> quot; 4バイトです(たとえば、UTF-32テキストを暗号化する場合、データは常に4の倍数になるため、パディングは一切ありません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top