我正在寻找使用 DES 算法加密文本字符串,但要求是加密字符串长度应与纯文本字符串长度相同。我已经尝试使用选项 CipherMode.CTS,但得到 CryptoGraphicException“指定的密码模式对此算法无效。”
提前致谢。
我正在寻找使用 DES 算法加密文本字符串,但要求是加密字符串长度应与纯文本字符串长度相同。我已经尝试使用选项 CipherMode.CTS,但得到 CryptoGraphicException“指定的密码模式对此算法无效。”
提前致谢。
正如前段时间在这篇 CodeProject 文章中所述。
当前随 .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 是谨慎的做法。但它似乎没有。