예외, 여기지도이다 : 나는 그러나, 지금 코드를 저장/열기를 완료하고 테스트FileStream.Read()가 ArgumentException이
, ArgumentException
이 발생했습니다.
코드는 다음과 같이 실행됩니다.
- 암호화되지 않은 사용자 데이터를 포함하기위한 유형 변수
byte[]
을 만듭니다. FileStream
처음 5 바이트에 매직 번호를 씁니다.RijndaelManaged
은 key를 받아들이고 초기화 벡터를 생성합니다.FileStream
다음 16 바이트에 초기화 벡터를 씁니다. < - 예외가 발생했습니다.CryptoStream
는 22 바이트 데이터로부터 암호화 되 기입 1.FileStream
로부터 변수를 변환.
디버깅 및 그 이유를 발견했습니다. FileStream.Read()
예외가 발생했습니다. 메시지는 다음과 같습니다.
오프셋 및 길이가 배열의 범위를 벗어나거나 개수가 인덱스에서 소스 모음 끝까지의 요소 수보다 많습니다.
(사용자 데이터) +21로 스트림 길이를 설정하려고했지만 작동하지 않습니다. 나는 파일을 저장하기위한 전체 코드를 첨부하고, 나는이 문제가 해결되기를 바란다.
감사합니다.
private bool SaveFile(string FilePath, bool IsCrypt)
{
byte[] Data = Encoding.UTF8.GetBytes(WorkspaceList[CurrentIndex]._textbox.Text);
using (var Stream = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
if (IsCrypt)
{
Stream.SetLength(Data.Length + 21); // Tried when I got Exception
Stream.Write(MagicNumber, 0, 5); //Magic Number
using (var CryptoHandler = new RijndaelManaged()) // AES256 Encryption
{
CryptoHandler.BlockSize = 128;
CryptoHandler.KeySize = 256;
CryptoHandler.Padding = PaddingMode.PKCS7;
CryptoHandler.Mode = CipherMode.CBC;
var tempKey = WorkspaceList[CurrentIndex]._cryptkey;
if(tempKey.Length < 32)
{
tempKey.PadRight(32);
}
else if (tempKey.Length > 32)
{
tempKey.Remove(33);
}
CryptoHandler.Key = Encoding.UTF8.GetBytes(WorkspaceList[CurrentIndex]._cryptkey.PadRight(32));
CryptoHandler.GenerateIV();
Stream.Write(CryptoHandler.IV, 5, 16); //IV Insertion *** ArgumentException ***
var CryptoInstance = CryptoHandler.CreateEncryptor(CryptoHandler.Key, CryptoHandler.IV);
using (var MemoryHandler = new MemoryStream())
{
using (var Crypto = new CryptoStream(MemoryHandler, CryptoInstance, CryptoStreamMode.Write))
{
byte[] _Buffer = Data;
Crypto.Read(Data, 0, Data.Length);
_Buffer = MemoryHandler.ToArray();
Stream.Write(_Buffer, 21, _Buffer.Length); // Insert Crypted Data
Stream.Close();
return true;
}
}
}
}
else
{
Stream.Write(Data, 0, Data.Length);
Stream.Close();
return true;
}
}
}
5는 의미가 없습니다. 파일에서 오프셋이 아닙니다. 대신에 0을 전달하면 IV에있는 모든 바이트를 쓸 것입니다. CryptoHandler.IV.Length를 16 대신에 사용하십시오. 21에서 다시 잘못되었습니다. –