C# 为什么TransformBlock(字节[1])两次与TransformBlock(字节[2])不同?
在中,如果我在大小为1的块上调用TransformBlock方法两次,这不同于在大小为2的块上调用它一次,当您使用此类加密通过BinaryFormatter发送的对象时,这是有问题的 这是故意的吗 为了解决这个问题,我将salsa20包装在另一个类(decorator设计模式)中,该类一次生成并缓存64字节的块,基本上是这样的(在简化的伪代码中):C# 为什么TransformBlock(字节[1])两次与TransformBlock(字节[2])不同?,c#,cryptography,binaryformatter,stream-cipher,C#,Cryptography,Binaryformatter,Stream Cipher,在中,如果我在大小为1的块上调用TransformBlock方法两次,这不同于在大小为2的块上调用它一次,当您使用此类加密通过BinaryFormatter发送的对象时,这是有问题的 这是故意的吗 为了解决这个问题,我将salsa20包装在另一个类(decorator设计模式)中,该类一次生成并缓存64字节的块,基本上是这样的(在简化的伪代码中): 专用队列; 私有密码转换; 公共整型转换块(字节[]输入,字节[]输出){ while(input.Length>queue.Count){ 字节[
专用队列;
私有密码转换;
公共整型转换块(字节[]输入,字节[]输出){
while(input.Length>queue.Count){
字节[]temp1=新字节[64];
字节[]temp2=新字节[64];
salsa20CryptoTransform.TransformBlock(temp1,temp2);
foreach(temp2中的字节b){
排队。排队(b);
}
}
对于(int i=0;i块就是块;许多压缩和加密过程都有块的特殊划分,它们基本上重置了一些东西-使块成为一个单元(可能也是可以解读的最小单元-流式API的一个重要考虑因素)。但重要的问题不是“加密数据是一样的吗”-坦率地说,不必如此。在许多情况下,如果每次你调用它时它都以不同的方式进行加密(通过一些内部随机性),那么它将是完全合法的。唯一重要的问题是:
如果我用正确的密钥对其进行适当的解密:我是否能取回原始数据
块就是块;许多压缩和加密过程都有块的特殊划分,它们本质上会重置一些东西——使块成为一个单元(可能也是可以解读的最小单元——流式API的一个重要考虑因素)。然而,重要的问题不是“加密的数据是相同的吗?”“-坦率地说,这不需要。在许多情况下,如果每次你调用它时它都以不同的方式对其进行加密(通过一些内部随机化),这将是完全合法的。唯一重要的问题是:
如果我用正确的密钥对其进行适当的解密:我是否能取回原始数据
实际上,每次调用加密函数时,加密数据几乎总是不同的,这就是初始化向量和nonce的用途。我很确定TransformBlock
应该与底层块无关。它用于处理调用者选择的大小的块,以及它的底层实现根据需要将其拆分为块的职责。在多个TransformBlock
s和最终的TransformFinalBlock
之间拆分数据的方式应该不会对结果产生影响。IVs也不会在块之间更改。您首先修复key和nonce,然后获得任意长度的流作为输出它将xor转换为明文。实际上,每次调用加密函数时,加密数据几乎总是不同的——这就是初始化向量和nonce的用途。我非常确定TransformBlock
应该与底层块无关。它用于处理数据块调用者选择的大小以及底层实现根据需要将其拆分为块的职责。在多个TransformBlock
s和最终TransformFinalBlock
之间拆分数据的方式应该不会对结果产生影响。IVs也不会在块之间更改。您首先修复key和nonce,然后获取任意长度的流作为输出,该流将xor转换为明文。听起来像是您正在使用的实现中的错误。TransformBlock
应该与基础块没有关系。听起来像是您正在使用的实现中的错误。TransformBlock
应该与基础块没有关系。
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();
}
}