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();
}
}
セキュリティ面で気をつけていることはありますか?