0

我有一个系统由两部分组成 - c++ 和 c# 应用程序。这部分有一个可以读写的共享文件。为了保护我的文件免受普通用户的攻击,我使用 AES 加密。C++ 应用程序使用 openSSL ctypto 库 AES 实现,而 C# 应用程序使用 .NET Framework System.Security.Cryptography。对于加密,我使用 CBC 模式。某些应用程序中的加密/解密效果很好,但是当我尝试在一个应用程序(C++)中加密并在另一个应用程序(C#)中解密时,我遇到了异常:

填充无效且无法移除

我的测试是在 C++ 应用程序中加密 32 字节的纯数据,然后将其写入文件,然后在 C# 应用程序中读取和解密尝试。我通过以下方式进行解密:

using (AesCryptoServiceProvider aesEncryptor = new AesCryptoServiceProvider())
{
    aesEncryptor.Mode = CipherMode.CBC;
    aesEncryptor.Key = entropy;

    // it's the same in C++ application too
    byte[] iv = { 0x46, 0xb6, 0x02, 0x6a,
                  0x99, 0x21, 0x90, 0xde,
                  0xfd, 0xf4, 0x5b, 0x42,
                  0x94, 0xde, 0xa6, 0x23 }; 
    aesEncryptor.IV = iv;

    using (ICryptoTransform decryptor = aesEncryptor.CreateDecryptor(aesEncryptor.Key,
                                                                     aesEncryptor.IV))
    {
        byte[] decrypted;
        // Create the streams used for decryption.
        using (MemoryStream msDecrypt = new MemoryStream(encryptedData))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                                                             decryptor,
                                                             CryptoStreamMode.Read))
            {
                decrypted = new byte[encryptedData.Length];
                var byteCount = csDecrypt.Read(decrypted, 0, encryptedData.Length);
                return decrypted;

            }
        }
    }
}

我还提供了完整的异常描述:

$exception {System.Security.Cryptography.CryptographicException:填充无效且无法删除。在 System.Security.Cryptography.CapiSymmetricAlgorithm.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 在 System.Security.Cryptography.CapiSymmetricAlgorithm.DepadBlock(Byte[] block, Int32 offset, Int32 count) 在 System.Security.Cryptography System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) 中的 .CryptoStream.FlushFinalBlock() ?
System.IO.Stream.Dispose() 中的 System.IO.Stream.Close()

4

1 回答 1

1

您没有提供加密代码,但异常表明用于加密的填充模式与 C# 中解密期间使用的填充模式不同(这将是默认的填充模式:)PaddingMode.PKCS7

检查加密时使用的填充模式,并确保使用相同的模式进行解密。.NET 中的可用模式列表可在此处获得。

于 2013-09-23T12:05:21.903 回答