У меня есть несколько больших зашифрованных файлов с использованием кода из https://gist.github.com/hanswolff/8809275.
Это код шифрования:
BUF_LENGTH = 16
FileStream FsInput = new FileStream(InFileName, FileMode.Open, FileAccess.Read);
FileStream FsOutput = new FileStream(OutFileName, FileMode.OpenOrCreate, FileAccess.Write);
byte[] ReadBuffer = new byte[BUF_LENGTH];
long InFileLength = FsInput.Length;
long AllBytes = 0;
int PartBytes = 0;
if (InFileLength == 0)
return false;
ICryptoTransform AESEncryptor = AESEncoder.CreateEncryptor(KeyBytes, null);
CrStream = new CryptoStream(FsOutput, AESEncryptor, CryptoStreamMode.Write);
while (AllBytes < InFileLength)
{
PartBytes = FsInput.Read(ReadBuffer, 0, BUF_LENGTH);
CrStream.Write(ReadBuffer, 0, PartBytes);
AllBytes = AllBytes + PartBytes;
}
CrStream.Close();
FsInput.Close();
FsOutput.Flush();
FsOutput.Close();
Код прекрасно работает для полных файлов.Что нужно, так это выборочно искать определенный блок зашифрованного файла и расшифровывать только этот блок.
Угадайте, что это возможно?
CipherInputStream , кажется, делает эту работу, но мне нужно, чтобы это было сделано в C #.
private byte[] read_block(String filepath, long pos, int length)
{
byte[] data = readfile(filepath, pos, length); // returns the specific block.
byte[] plaindata = new byte[data.Length];
byte[] kb = PrepareKeyIvBytes();
byte[] nba = new byte[IvBytes.Length];
IvBytes.CopyTo(nba, 0);
AESDecoder = new Aes128CounterMode(nba);
ICryptoTransform AESDecryptor = AESDecoder.CreateDecryptor(IvBytes, null);
MemoryStream ms = new MemoryStream();
CrStream = new CryptoStream(ms, AESDecryptor, CryptoStreamMode.Write);
CrStream.Write(data, 0, length);
CrStream.Close();
ms.Flush();
ms.ToArray().CopyTo(plaindata, 0);
return plaindata;
}
Я написал этот кусок кода, но это работает только до тех пор, пока мы сохраняем переменную pos
равной 0. Если я установлю для нее другое значение, например 512, это не сработает.
Кто-нибудь знает, где я должен искать?
Спасибо!