我需要解密在OFB模式下使用3DES加密的消息。
我有一条加密邮件。我有钥匙。我有一个IV。
我在.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模式。
答案 0 :(得分:2)
第三方CryptoSys API表示它特别支持OFB模式下的Triple-DES。 Dunno为什么.NET实现不会,尽管一个很好的理由可能是阻止它在新开发中的使用,支持更快的Rijndael和AES密码。
编辑:只是为了解释,算法的“模式”是一种定义的方式,利用基本的Triple-DES加密算法来产生加密文本。这些已经成为大多数对称密钥算法的标准化。 OFB模式是两种标准“流密码”模式之一,它使用基本算法根据已加密的文本创建“移位寄存器”,允许在第一个“块”之后的文本一次加密一个字节在更大的“块”中。
无论如何,“密钥大小”错误指向特定类型的问题。三重DES算法(所有这些算法;这不是特定于实现的)需要一个长度为128或192位的密钥。您将密钥作为字节数组获取,因此您需要一个长度恰好为16或24个元素的数组。这应该是你的第一次检查之一;如果键的大小不正确,则抛出ArgumentException。跟踪调用堆栈中的问题,直到找到生成密钥的位置并从源头解决问题。
接下来,如果你将TripleDesCryptoServiceProvider
的Mode属性设置为OFB,然后它就会给你一个CryptoException
,或者当你开始解密时不支持该模式,那么那就是.NET限制; .NET开发人员团队没有费心在提供程序中实现该算法的那种模式。尝试推销自己的东西要比它的价值更麻烦;您将不得不寻找.NET代码可以使用的第三方实现。几乎任何为COM interop注册的库都可以完成这个技巧,而不必用.NET语言编写。有几十个;我会搜索CryptoSys,就像我说的那样,文档说它支持TripleDES OFB的名字。
答案 1 :(得分:1)
错误消息准确地告诉您问题所在:“指定的密钥不是此算法的有效大小。”
你说“关键是base64中的24个字符”。 Base64每个字符编码6位,因此总共144位。但3DES密钥应为64位(== DES),128位或196位。您必须使用适当长度的密钥或计算出另一端的库正在将密钥转换为适当长度的内容。