1

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();
    }
}

在安全方面我应该关注什么吗?

4

1 回答 1

1

块是块;许多压缩和加密过程对块有特殊的划分,它们基本上重置了一些东西 - 使块成为一个单元(可能也是可以解扰的最小单元 - 流式 API 的一个重要考虑因素)。然而,重要的问题不是“加密数据是否相同”——坦率地说,它不需要如此。在许多情况下,如果每次调用它时都以不同的方式加密它(通过一些内部随机化),那将是完全合法的。唯一重要的问题是:

如果我使用正确的密钥正确解密:我能取回原始数据吗?

于 2013-09-07T13:54:05.570 回答