关于加密:使用通过BouncyCastle AesFastEngine加密的C#AesCryptoServiceProvider加密数据

Encrypt Data with C# AesCryptoServiceProvider crypted with BouncyCastle AesFastEngine

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

有没有办法做到这一点?

我找不到在Bouncy Castle实现中使用的IV ...有吗?

任何帮助都很好!
马库斯

编辑:

以下代码用于初始化AesFastEngine:

1
2
3
4
5
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);

编辑:

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

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

这是我编写的用于解密的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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托管正在运行,但是它给了我多一个字节的加密数据。其他所有字节都相同...我尝试了很多,但我不知道如何用充气城堡获取最后一个字节...如果没有最后一个字节,则无法使用RijndaelManaged解密数据...


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

编辑:

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

1
AesManagedAlg.Mode = CipherMode.CFB;

此外,您似乎正在解密readedBytes个字节的数据,但仅在明文中添加buffer[0]并忽略其余部分。

编辑2:

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