这个方法在我制作的程序中运行良好。但是,我无法真正理解发生了什么以及实际执行加密的位置。我从MSDN上阅读了相关描述,但没有给出太多信息。 有人可以解释一般情况,尤其是第8行和第9行。
public byte[] Decrypt(byte[] input, byte[] key, byte[] iv)
{
DES des = new DESCryptoServiceProvider();
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
des.Key = key;
ICryptoTransform ct = des.CreateDecryptor(key, iv);
byte[] result = ct.TransformFinalBlock(input, 0, input.Length);
return result;
}
答案 0 :(得分:1)
如果你想了解发生了什么,你应该在这里阅读块密码操作:
http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_.28ECB.29
简而言之,块密码链接导致一个块操作的输入被送入下一个块操作。这会模糊密文中的任何块级模式。由于存在链接结构,最后一个块从第二个最后一个块获得输入,依此类推......直到第二个块从第一个块获得输入。现在第一个块需要从某个东西获得输入,但是没有前面的块。因此我们使用称为初始化向量(iv)的东西来启动它。这个IV不需要像密钥一样秘密,但它需要具有较低的重用概率(否则攻击者可以使用它来关联所有密文的第一个块)。通常使用随机数,或者有时增加序列号。
关于具体电话:
您的方法可以使用DES解密单个块。 (顺便提一下,现在考虑过时和不安全,请考虑使用AES - 块密码结构保持不变,所以你需要做的就是交换库)。无论如何,
由于您在ECB模式下使用密码,因此每个块都使用相同的初始化向量独立解密,该向量将提供给您的Decrypt方法调用。对CreateDecryptor的调用使用提供的密钥和初始化向量初始化解密对象。
使用对TransformFinalBlock的调用执行实际解密。参数是输入字节数组,然后是偏移量和长度参数(用于不想解密整个字节数组时)。在这种情况下,您确实希望使用整个字节数组,因此起始偏移量为0,大小是整个字节数组的长度。
您应该添加的一件事是检查输入字节数组是否为密码的正确块大小,否则会引发异常。在DES的情况下,这是64位。如果按照我的建议切换到AES,它将是128位。