4

我需要使用标准 C# AesCryptoServiceProvider 解密数据,该数据在 Java 端使用 Bouncy Castle AesFastEngine 加密。(使用Bounca Castle的c#实现解密数据没问题)

有没有办法做到这一点?

我没有找到在 Bouncy Castle 实施中使用的 IV……有吗?

任何帮助都会很好!马库斯

编辑:

以下代码用于初始化 AesFastEngine:

BlockCipher coder = new AESFastEngine();
CFBBlockCipher cfbCipher = new CFBBlockCipher(coder, 8);
StreamCipher streamCipher = new StreamBlockCipher(cfbCipher);
streamCipher.Init(true, keyParameter);
streamCipher.ProcessBytes(data, 0, data.Length, encodedMessageBytes, 0);

编辑:

您好 Grec,感谢您的回答,但它仍然无法正常工作...我有一个示例解决方案可在此处下载。

如果您单击两个按钮,您已经获得了一个不同的加密数组......???解密用充气城堡产生的数组会导致异常,说加密数据的长度无效......

这是我为解密编写的代码:

AesManagedAlg = new AesManaged();
AesManagedAlg.Mode = CipherMode.CBC;
AesManagedAlg.FeedbackSize = 8;
AesManagedAlg.Key = key;
// Use Test
AesManagedAlg.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 

// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = AesManagedAlg.CreateDecryptor(AesManagedAlg.Key, AesManagedAlg.IV);

// Create the streams used for decryption.
msDecrypt = new MemoryStream(cipherText);
csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);

// Read the decrypted bytes from the decrypting stream
var decryptedData = new List<byte>();
var buffer = new byte[1];
while (true) {
    var readedBytes = csDecrypt.Read(buffer, 0, buffer.Length);
    if(readedBytes == 0) break;
    decryptedData.Add(buffer[0]);
}
ret = decryptedData.ToArray();

编辑:

越来越接近!RijndaelManaged managed 正在工作,但它给了我一个字节的加密数据。所有其他字节都相同...我尝试了很多,但我不知道如何使用充气城堡获取最后一个字节...如果没有最后一个字节,则无法使用 RijndaelManaged 解密数据...

4

1 回答 1

1

您使用的 IV 是默认的 IV,全为零。您应该能够在 .NET 中通过创建一个AesManaged对象、将模式CipherMode.CFB设置为并将 FeedbackSize 设置为 8 来执行此操作。然后使用该CreateEncryptor方法创建一个ICryptoTransform,并依次使用它来创建一个CryptoStream. 这个例子应该有助于最后几个步骤。

编辑:

查看您发布的新代码,第二行是错误的。您需要指定CFB模式,而不是 CBC。第二行应该是

AesManagedAlg.Mode = CipherMode.CFB;

此外,看起来您正在解密readedBytes数据字节,但只添加buffer[0]到明文并忽略其余部分。

编辑2:

如前所述,AesManaged不能在 CFB 模式下使用,但 RijndaelManaged 可以。请注意,AES 算法只是限制为 128 位块大小和 128、192 或 256 位密钥大小的 Rijndael 算法。有关示例,请参见我对类似问题的回答。

于 2010-07-01T03:06:24.937 回答