在salsa20 的 C# 实现中,如果我在大小为 1 的块上调用方法 TransformBlock 两次,这与在大小为 2 的块上调用它一次不同,当您使用此类加密对象时,这是有问题的通过 BinaryFormatter 发送。
这是设计使然吗?
为了解决这个问题,我将 salsa20 包装在另一个类(装饰器设计模式)中,它一次生成和缓存 64 字节的块,基本上像这样(在简化的伪代码中):
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();
}
}
在安全方面我应该关注什么吗?