1

salsa20のC# 実装では、サイズ 1 のブロックでメソッド TransformBlock を 2 回呼び出すと、サイズ 2 のブロックでメソッドを 1 回呼び出す場合とは異なります。このクラスを使用してオブジェクトを暗号化する場合、これは問題になります。 BinaryFormatter 経由で送信されます。

これは設計によるものですか?

これを改善するために、一度に 64 バイトのブロックを生成してキャッシュする別のクラス (デコレータ デザイン パターン) で salsa20 をラップしました。

private Queue<byte> queue;
private ICryptoTransform salsa20CryptoTransform;
public int TransformBlock(byte[] input, byte[] output){
    while(input.Length > queue.Count){
        byte[] temp1 = new byte[64];
        byte[] temp2 = new byte[64];
        salsa20CryptoTransform.TransformBlock(temp1, temp2);
        foreach(byte b in  temp2){
            queue.Enqueue(b);
        }
    }
    for(int i = 0;i<input.Length;i++){
        output[i] = intput[i] ^ queue.Dequeue();
    }
}

セキュリティ面で気をつけていることはありますか?

4

1 に答える 1

1

ブロックはブロックです。多くの圧縮および暗号化プロセスには、ブロックの特別な境界があり、基本的にいくつかのことをリセットします-ブロックをユニットにします(スクランブルを解除できる最小単位でもある可能性があります-ストリーミングAPIの重要な考慮事項です). ただし、重要な問題は「暗号化されたデータが同じかどうか」ではありません。率直に言って、そうである必要はありません。多くの場合、呼び出すたびに別の方法で暗号化されていれば(内部ランダム化によって) 完全に正当化されます。唯一の重要な質問は次のとおりです。

これを正しいキーで適切に復号化すると、元のデータが返されますか?

于 2013-09-07T13:54:05.570 に答える