使用BouncyCastle AesFastEngine加密C#AesCryptoServiceProvider加密数据

时间:2010-06-29 15:38:36

标签: c# encryption cryptography bouncycastle

我需要使用标准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,谢谢您的回答,但它仍然无效...... 我有一个示例解决方案可以下载here

如果你单击两个按钮,你会得到一个不同的加密数组...... ??? 解密使用充气城堡生成的阵列导致一个例外,说加密数据的长度无效......

以下是我为解密编写的代码:

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解密数据... < / p>

1 个答案:

答案 0 :(得分:1)

您正在使用的IV是默认的IV,全部为零。您应该可以通过创建AesManaged对象,将模式设置为CipherMode.CFB并将FeedbackSize设置为8来在.NET中执行此操作。然后使用CreateEncryptor方法创建ICryptoTransform 1}},然后依次使用它来创建CryptoStreamThis example应该帮助完成最后几个步骤。

编辑:

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

AesManagedAlg.Mode = CipherMode.CFB;

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

编辑2:

如上所述,AesManaged不能用于CFB模式,但RijndaelManaged可以。请注意,AES算法只是限制在128位块大小和128,192或256位密钥大小的Rijndael算法。有关示例,请参阅my answer类似的问题。