好吧,我一直在尝试加密和解密文件一段时间后我一直得到这个异常
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();
}
答案 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
,以及在访问i
时encResult
加倍。
此外,如果encResult
具有奇数个字节,则您没有考虑最后一个字节。
从根本上说,不清楚为什么要将byte[]
转换为short[]
,然后将其作为 text 首先写入磁盘。如果您已经避免了所有这些转换并且只是将原始字节写出来,那么您就不会遇到这个问题。