这个方法在我编写的程序中运行得很好。然而,我不能真正理解发生了什么,以及加密实际上是在哪里执行的。我从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;
}发布于 2014-01-01 01:20:56
如果你想了解发生了什么,你应该在这里阅读关于块密码操作的内容:
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位。
https://stackoverflow.com/questions/20860772
复制相似问题