如何在OFB模式下使用C#中的3DES解密?

如何在OFB模式下使用C#中的3DES解密?,c#,encryption,3des,C#,Encryption,3des,我需要解密在OFB模式下使用3DES加密的消息 我有一条加密信息。我有钥匙。我要静脉注射 我在.Net平台上 在base64中,加密消息的长度为24个字符。 base64中的密钥长度为24个字符。 IV是一个64位二进制数 由于缺少示例,我尝试使用ECB模式示例,如下所示: public static string DecryptTextFromMemory(byte[] Data, byte[] Key, byte[] IV) { try {

我需要解密在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模式,我几乎找不到什么。第三方CryptoSys API说它特别支持OFB模式下的三重DES。不知道为什么.NET实现不会,尽管一个很好的理由可能是不鼓励在新的开发中使用它,而支持更快的Rijndael和AES密码

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

无论如何,“密钥大小”错误指向一种特定类型的问题。三重DES算法(所有算法;这不是特定于实现的)需要一个长度正好为128或192位的密钥。将密钥作为字节数组获取,因此需要一个长度正好为16或24个元素的数组。这应该是你的第一张支票之一;如果密钥大小不正确,则引发ArgumentException。沿着调用堆栈跟踪问题,直到找到密钥的生成位置,并在其源位置修复问题


接下来,如果您将
TripleDesCryptoServiceProvider
的Mode属性设置为OFB,并且此时或当您开始解密该模式不受支持时,它会为您提供一个
CryptoException
,那么这就是.NET限制;NET开发团队没有费心在提供者中实现该算法的那种模式。试着自己滚,麻烦会比它的价值更大;您必须寻找可由.NET代码使用的第三方实现。几乎所有为COM互操作注册的库都可以做到这一点,而不必用.NET语言编写。有几十个,;我会搜索CryptoSys,正如我所说的,文档中说它支持按名称三倍的OFB。

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


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

我对解密一无所知。我收到了一封3DES格式的加密邮件,并被告知必须使用OFB模式才能解密。我别无选择!谢谢你的详细答复。我的密钥是24个元素,所以我认为这不是问题。我在其他网站上看到过与我有同样问题的人发的其他帖子,他们都没有得到任何令人满意的答案,所以我猜可能会出现.net限制的情况,但我会在一分钟内尝试更多的代码,并将其发布在这里,为我自己证实这一点,除非其他人有明确的答案。有人能告诉我在OFB模式下解密3DE的工作示例吗?我不想在调试这段代码时陷入困境。我真的不该把它写在帖子里。我要找的是一个在OFB模式下3DES解密的工作示例。可能是这个Hasturkun的副本,链接到这篇文章。@crystal,现在删除那个评论。你不应该公开发布密钥,即使它们是错的。谢谢,@Peter。我现在让一位同事使用带有24个字符密钥的php组件成功解密数据,以验证我使用的数据。您能否评论一下该键长度在php组件中如何工作,而不是在本场景中?为了让大家了解更多,我得到了一个如何在php中进行解密的示例,但这不是一条对我开放的途径。我需要在.net中复制该过程,但我马上就被密钥长度绊倒了。@crystal,请您的同事深入研究他们的php,并告诉您如何将该值转换为3DES密钥。@peter,他不知道,但这是php示例中的相关片段<代码>//初始化加密机制(无特定算法和模式目录)$dec=mcrypt_module_open(mcrypt_TRIPLEDES,“,mcrypt_mode_NOFB,”)//获取算法的最大密钥大小,应始终为24(3x8字节,适用于3DES)$max\u key\u size=mcrypt\u enc\u get\u key\u size($dec)//构建有效的解密密钥,该密钥是私钥的子集,与salt$decrypt\u key=substr($key\u buffer,$salt,$max\u key\u size)组合@crystal,最后一行是密钥:
$decrypt\u key=substr($key\u buffer,$salt,$max\u key\u size)它没有使用全部内容。找出
$salt
的值是什么,以及当要求一个比输入字符串长的子字符串时
substr
做了什么。然后找到写这封信的人,告诉他们不要滥用“盐”这个词。