我需要使用标准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>
答案 0 :(得分:1)
您正在使用的IV是默认的IV,全部为零。您应该可以通过创建AesManaged
对象,将模式设置为CipherMode.CFB
并将FeedbackSize设置为8来在.NET中执行此操作。然后使用CreateEncryptor
方法创建ICryptoTransform
1}},然后依次使用它来创建CryptoStream
。 This example应该帮助完成最后几个步骤。
编辑:
查看您发布的新代码,第二行是错误的。您需要指定 CFB 模式,不 CBC 。第二行应该是
AesManagedAlg.Mode = CipherMode.CFB;
此外,您似乎正在解密readedBytes
个字节的数据,但只将buffer[0]
添加到明文而忽略其余部分。
编辑2:
如上所述,AesManaged
不能用于CFB模式,但RijndaelManaged可以。请注意,AES算法只是限制在128位块大小和128,192或256位密钥大小的Rijndael算法。有关示例,请参阅my answer类似的问题。