0

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

提前致谢。

4

1 回答 1

2

正如前段时间在这篇 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 是谨慎的做法。但它似乎没有

于 2013-08-20T13:47:30.963 回答