CryptopgraphicException尝试取消保护字节数组时“参数不正确”

时间:2013-02-24 08:21:16

标签: c# exception visual-studio-2012 cryptography windows-phone-8

好吧,我一直在尝试加密和解密文件一段时间后我一直得到这个异常

  

System.Security.Cryptography.CryptographicException:参数不正确。

它完美地写入文件,并且字节数组确实具有合法条目。但是当我尝试解密时,这仍然会被抛出。

以下是整个功能:

    private static void loadTimes()
    {
        try
        {

            short[] encShorts = new short[bestTimes.Length / 2];

            IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
            IsolatedStorageFileStream stream = new IsolatedStorageFileStream("test.txt", FileMode.Open, FileAccess.ReadWrite, store);

            StreamReader stmReader = new StreamReader(stream);
            int i = 0;
            while (!stmReader.EndOfStream)
            {
                encShorts[i] = short.Parse(stmReader.ReadLine());
                i++;
            }
            stmReader.Close();

            byte[] encBytes = new byte[bestTimes.Length];

            for (int j = 0; j < encShorts.Length; j++)
            {
                encBytes[j * 2] = (byte)(encShorts[j] / 256);
                encBytes[j * 2 + 1] = (byte)(encShorts[j] % 256);
            }

            bestTimes = ProtectedData.Unprotect(encBytes, null);

            checkForTimeAds();
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }

基本上它是从文件中加载以获得游戏中的最佳时间分数,并且由于它们是短路的,我将它们分成两位。

以下代码抛出异常:

bestTimes = ProtectedData.Unprotect(encBytes, null);

我到处寻找,似乎有很多人没有得到解决,有些人会说“竞争条件”,但我不完全确定这是否适用于此。为什么我得到这个例外?

Jon Skeet要求的保存代码:

    private static void saveTimes()
    {
        try
        {
            byte[] encResult = ProtectedData.Protect(bestTimes, null);

            short[] encShorts = new short[bestTimes.Length / 2];
            for (int i = 0; i < encShorts.Length; i++)
            {
                encShorts[i] = (short) (encResult[i] * 256 + encResult[i + 1]);
            }

            IsolatedStorageFile store = System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication();
            IsolatedStorageFileStream stream = new IsolatedStorageFileStream("test.txt", FileMode.Create, FileAccess.Write, store);

            StreamWriter writer = new StreamWriter(stream);
            foreach (short part in encShorts)
            {
                writer.WriteLine(part);
            }
            writer.Close();
        }
        catch (Exception)
        {
            MessageBox.Show("Couldn't save the file.");
        }

        checkForTimeAds();
    }

1 个答案:

答案 0 :(得分:2)

您的原始转换代码(到short[])已损坏:

short[] encShorts = new short[bestTimes.Length / 2];
for (int i = 0; i < encShorts.Length; i++)
{
    encShorts[i] = (short) (encResult[i] * 256 + encResult[i + 1]);
}

应该是:

short[] encShorts = new short[encResult.Length / 2];
for (int i = 0; i < encShorts.Length; i++)
{
    encShorts[i] = (short) (encResult[i * 2] * 256 + encResult[i * 2 + 1]);
}

请注意在确定长度时使用encResult代替bestTimes,以及在访问iencResult加倍。

此外,如果encResult具有奇数个字节,则您没有考虑最后一个字节。

从根本上说,不清楚为什么要将byte[]转换为short[],然后将其作为 text 首先写入磁盘。如果您已经避免了所有这些转换并且只是将原始字节写出来,那么您就不会遇到这个问题。