Расшифровать отдельные части зашифрованных файлов AES - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть несколько больших зашифрованных файлов с использованием кода из 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, это не сработает.
Кто-нибудь знает, где я должен искать?
Спасибо!

...