3

我需要解密在 OFB 模式下使用 3DES 加密的消息。

我有一个加密的消息。我有一把钥匙。我有静脉注射。

我在.Net平台上

加密消息在 base64 中为 24 个字符长。密钥在 base64 中为 24 个字符长。IV 是一个 64 位的二进制数。

由于缺乏示例我尝试使用ECB模式示例,如下:

   public static string DecryptTextFromMemory(byte[] Data, byte[] Key, byte[] IV)
    {
        try
        {
            // Create a new MemoryStream using the passed 
            // array of encrypted data.
            MemoryStream msDecrypt = new MemoryStream(Data);

            // Create a CryptoStream using the MemoryStream 
            // and the passed key and initialization vector (IV).
            CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),
                CryptoStreamMode.Read);

            // Create buffer to hold the decrypted data.
            byte[] fromEncrypt = new byte[Data.Length];

            // Read the decrypted data out of the crypto stream
            // and place it into the temporary buffer.
            csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);

            //Convert the buffer into a string and return it.
            return new ASCIIEncoding().GetString(fromEncrypt);
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
            return null;
        }
    }

这是我得到的错误:

发生加密错误:指定的密钥不是此算法的有效大小。

我尝试了其他代码示例,其中我将算法更改为 OFB,但它说它不受支持。

谁能帮帮我吗?我显然对这些东西不够了解,所以如果我搞砸了一些明显的事情,请耐心等待。

在 ECB 模式中有大量 3DES 解密的示例,但我几乎找不到关于 OFB 模式的信息。

4

2 回答 2

2

第三方 CryptoSys API 表示它特别支持 OFB 模式下的 Triple-DES。不知道为什么 .NET 实现不会,尽管一个很好的理由可能是阻止它在新开发中的使用,以支持更快的 Rijndael 和 AES 密码。

编辑:只是为了解释一下,算法的“模式”是利用基本三重 DES 加密算法生成加密文本的定义方式。这些已成为大多数对称密钥算法的标准化。OFB 模式是两种标准“流密码”模式之一,它使用基本算法根据已加密的文本创建“移位寄存器”,允许第一个“块”之后的文本一次加密一个字节在更大的“块”中。

无论如何,“密钥大小”错误指向特定类型的问题。Triple-DES 算法(所有这些算法;这不是特定于实现的)需要一个正好为 128 位或 192 位长的密钥。您将密钥作为字节数组获取,因此您需要一个长度正好为 16 或 24 个元素的数组。这应该是您的第一次检查;如果键的大小不正确,则抛出 ArgumentException。沿着调用堆栈跟踪问题,直到找到生成密钥的位置并从源头解决问题。

接下来,如果您将 Mode 的属性设置TripleDesCryptoServiceProvider为 OFB,并且它给您一个CryptoException权利,或者当您开始解密时不支持该模式,那么这是一个 .NET 限制;.NET 开发团队没有费心在提供程序中实现该算法的该模式。尝试自己动手,麻烦多于其价值;您必须寻找可供 .NET 代码使用的第三方实现。几乎所有为 COM 互操作注册的库都可以解决问题,不必用 .NET 语言编写。有几十个;我会搜索 CryptoSys,就像我说的那样,文档说它按名称支持 TripleDES OFB。

于 2011-02-02T22:15:19.620 回答
1

错误消息准确地告诉您问题所在:“指定的密钥不是此算法的有效大小。”

您说“密钥在 base64 中为 24 个字符长”。Base64 对每个字符编码 6 位,因此总共有 144 位。但是 3DES 密钥应该是 64 位 (==DES)、128 位或 196 位。您必须使用适当长度的密钥,或者计算出另一端的库正在做什么以将密钥转换为适当的长度。

于 2011-02-03T13:25:12.197 回答