Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用使用BouncyCastle AesFastEngine加密的C#AesCryptoServiceProvider加密数据_C#_Encryption_Cryptography_Bouncycastle - Fatal编程技术网

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

使用使用BouncyCastle AesFastEngine加密的C#AesCryptoServiceProvider加密数据,c#,encryption,cryptography,bouncycastle,C#,Encryption,Cryptography,Bouncycastle,我需要使用标准的C#AesCryptoServiceProvider对数据进行解密,该服务在Java端使用Bouncy Castle AesFastEngine进行加密。(使用Castle的c#实现解密数据没有问题) 有办法做到这一点吗 我找不到Bouncy Castle实现中使用的IV。。。有吗 任何帮助都很好! 马库斯 编辑: 以下代码用于初始化AesFastEngine: BlockCipher coder = new AESFastEngine(); CFBBlockCipher cfb

我需要使用标准的C#AesCryptoServiceProvider对数据进行解密,该服务在Java端使用Bouncy Castle AesFastEngine进行加密。(使用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);
编辑:

你好,格雷克,谢谢你的回答,但它仍然不起作用。。。 我有一个示例解决方案要下载

如果您单击这两个按钮,您将得到一个不同的加密数组。。。??? 解密bouncy castle生成的数组会导致一个异常,即加密数据的长度无效

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

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();
AesManagedAlg=新的AesManaged();
AesManagedAlg.Mode=CipherMode.CBC;
AesManagedAlg.FeedbackSize=8;
AesManagedAlg.Key=Key;
//使用测试
AesManagedAlg.IV=新字节[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//创建decrytor以执行流变换。
ICryptoTransform decryptor=AesManagedAlg.CreateDecryptor(AesManagedAlg.Key,AesManagedAlg.IV);
//创建用于解密的流。
msDecrypt=新内存流(密文);
csDecrypt=新加密流(msDecrypt,解密程序,CryptoStreamMode.Read);
//从解密流中读取解密的字节
var decryptedData=新列表();
var buffer=新字节[1];
while(true){
var readedBytes=csDecrypt.Read(buffer,0,buffer.Length);
如果(readedBytes==0)中断;
decryptedData.Add(缓冲区[0]);
}
ret=decryptedData.ToArray();
编辑:


接近!RijndaelManaged正在工作,但它给了我一个字节的加密数据。所有其他字节都是相同的。。。我尝试了很多,但我不知道如何获得bouncy castle的最后一个字节。。。如果没有这最后一个字节,则无法使用RijndaelManaged…解密数据。

您使用的IV是默认的IV,全部为零。您应该能够在.NET中通过创建一个
AesManaged
对象,将模式设置为
CipherMode.CFB
并将反馈大小设置为8来实现这一点。然后使用
CreateEncryptor
方法创建
ICryptoTransform
,然后依次使用该方法创建
加密流。应该有助于完成最后几个步骤

编辑:

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

AesManagedAlg.Mode = CipherMode.CFB;
此外,看起来您正在解密数据的
readedBytes
字节,但只在明文中添加
buffer[0]
,而忽略其余部分

编辑2:


如前所述,
AesManaged
不能用于CFB模式,但RijndaelManaged可以。请注意,AES算法只是Rijndael算法,仅限于128位块大小和128、192或256位密钥大小。请参阅类似的问题以获取示例。

您使用了哪种AES模式?仅说您使用了AesFastEngine是不够的。以下代码用于初始化AesFastEngine:IBlockCipher coder=new AesFastEngine();CfBlockCipher CfBipher=新的CfBlockCipher(编码器,8);IStreamCipher streamCipher=新的StreamBlockCipher(cfbCipher);streamCipher.Init(true,keyParameter);streamCipher.ProcessBytes(数据,0,数据.Length,encodedMessageBytes,0);这些信息够了吗?请复制并粘贴代码。永远不要打字。你好,格雷格,非常感谢你的快速回答。我将尝试一下并发布结果…你好,格雷格,非常感谢你关注这个问题,即使德国与你之间存在时间间隔!!!如果我试图设置CipherMode.CFB,我会得到一个异常:(从德语翻译过来)指定的加密模式对此算法无效???(缓冲区只有1字节长-因此缓冲区[0]应该可以)是的,我得到了相同的错误。但是它与RijndaelManaged一起工作,这是相同的算法。谢谢这个提示!!!RijndaelManaged正在工作,但它给了我一个字节的加密数据。所有其他字节都是相同的。。。我尝试了很多,但我不知道如何使用bouncy castle获取最后一个字节…CBF不适用于AES。参见例外说明