ASP.NET DES加密,加密文本长度等于纯文本长度

时间:2013-08-20 04:44:13

标签: c# asp.net encryption cryptography des

我希望使用DES算法加密一串文本,但要求加密的字符串长度应该与纯文本字符串长度相同。我已经尝试使用选项CipherMode.CTS,但是获取CryptoGraphicException“指定的密码模式对此算法无效。”

提前致谢。

1 个答案:

答案 0 :(得分:2)

正如前一段时间this CodeProject article所述。

  

目前.NET Framework BCL附带的任何对称加密算法都不支持CTS模式。它包含在内以支持可能在以后从SymmetricAlgorithm类派生的新对称算法。

这篇文章是从2002年开始的,但经过进一步调查后,上面的引用似乎仍然准确。

幸运的是,Bouncy Castle确实支持CTS。

public static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
{
    BufferedBlockCipher cipher = new CtsBlockCipher(new CbcBlockCipher(new AesEngine()));
    ICipherParameters keyParam = new ParametersWithIV(new KeyParameter(key), iv);
    cipher.Init(true, keyParam);
    return cipher.DoFinal(data, 0, data.Length);
}

public static byte[] Decrypt(byte[] data, byte[] key, byte[] iv)
{
    BufferedBlockCipher cipher = new CtsBlockCipher(new CbcBlockCipher(new AesEngine()));
    ICipherParameters keyParam = new ParametersWithIV(new KeyParameter(key), iv);
    cipher.Init(false, keyParam);
    return cipher.DoFinal(data, 0, data.Length);
}

在这个例子中使用了CBC,你需要使用一个固定的IV,因为你可能没有任何地方可以为每次加密存储随机IV(这是更好的选择)。如果有任何方法可以更改加密数据长度要求,您应该这样做,并使用AES和CBC以及随机IV。 至少但是,请使用AES代替DES(如上面的代码所示)。无论您使用哪种块密码模式,DES都是不安全的。

还应该记住两件事。

首先,CTS(在Bouncy Castle实现中)要求您正在加密的数据长度至少为一个块。因此,如果您使用AES,您的数据将至少需要16个字节,或者如果您使用DES,则需要至少8个字节。

其次,如果您正在加密文本,则需要记住加密数据是二进制文件,并且您可能无法将其存储在与未加密文本相同的位置,而不将其编码为Hex或Base64 (这将增加它的长度)。

<强>更新

关于CTS强度/安全性的附注:鉴于ntoskrnl关于ECB与CTS的评论(这是正确的),我认为调查CTS是否以任何方式削弱CBC是明智的。但它似乎that it does not