在C# implementation of the salsa20中,如果我在大小为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();
}
}
在安全性方面,我有什么需要关注的吗?
答案 0 :(得分:1)
块是块;许多压缩和加密过程都有特殊的块划分,它们实际上重置了一些东西 - 使块成为一个单元(也可能是可以解密的最小单元 - 流API的一个重要考虑因素)。然而,重要的问题不是“加密数据是否相同” - 坦率地说,它并非必须如此。在许多情况下,如果每次调用(通过一些内部随机化),它将以不同方式加密它将是完全合法的。唯一重要的问题是:
如果我使用正确的密钥对其进行适当解密:我是否会取回原始数据?