0

わかりました、しばらくの間ファイルの暗号化と復号化を試みていましたが、この例外が発生し続けています

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());
        }
    }

基本的には、ゲームで最高のタイム スコアを取得するためにファイルから読み込みます。これらはショーツなので、それぞれを 2 つのビットに分割します。

次のコードは例外をスローします。

bestTimes = ProtectedData.Unprotect(encBytes, null);

私はいたるところを見てきましたが、多くの人が解決していないようで、「競合状態」について言う人もいますが、それがここに当てはまるかどうかは完全にはわかりません. なぜこの例外が発生するのですか?

Jon Skeet から要求された Saving コード:

    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();
    }
4

1 に答える 1

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を 2 倍にすることに注意してください。iencResult

encResultさらに、バイト数が奇数の場合、最後のバイトを考慮していません。

byte[]基本的に、なぜ aを a に変換してから、最初にテキストshort[]としてディスクに書き込むのかは明確ではありません。この変換をすべて回避し、生のバイトを書き出すだけであれば、この問題は発生しませんでした。

于 2013-02-24T09:23:01.127 に答える