Próbuję zaprojektować prostą aplikację do obliczania pliku CRC32/md5/sha1/sha256/sha384/sha512, a ja natknąłem się na blokadę drogi. Robi się to w języku C#.Jak zaszyfrować jeden plik na wiele sposobów w tym samym czasie?
Chciałbym móc to zrobić tak skutecznie, jak to tylko możliwe, więc początkowo myślałem o wczytaniu pliku do pamięci memorystream przed przetworzeniem, ale szybko odkryłem, że bardzo duże pliki powodują, że brakuje mi pamięci bardzo szybko. Tak więc wydaje się, że zamiast tego muszę użyć strumienia pliku. Problemem, jak widzę, jest to, że tylko jedna funkcja skrótu może być uruchomiona w tym samym czasie, a zrobienie tego z strumieniem pliku zajmie trochę czasu, aby każdy hasz zakończył się.
W jaki sposób mogę przeczytać niewielką część pliku w pamięci, przetwarzając go przy użyciu wszystkich 6 algorytmów, a następnie przechodząc na inną porcję ... A może mieszanie nie działa w ten sposób?
To była moja oryginalna próba odczytania pliku do pamięci. Nie udało się, kiedy próbowałem odczytać obraz płyty do pamięci przed uruchomieniem mieszania algorytmy na MemoryStream: algorytmy
private void ReadToEndOfFile(string filename)
{
if (File.Exists(filename))
{
FileInfo fi = new FileInfo(filename);
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[16 * 1024];
//double step = Math.Floor((double)fi.Length/(double)100);
this.toolStripStatusLabel1.Text = "Reading File...";
this.toolStripProgressBar1.Maximum = (int)(fs.Length/buffer.Length);
this.toolStripProgressBar1.Value = 0;
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
this.toolStripProgressBar1.Value += 1;
}
_ms = ms;
}
}
}
Próbowałem uruchomić to przy użyciu MD5, a program działa, chociaż wydaje się generować nieprawidłowe hashe. Oto link do mojego kodu: [link] (http://pastebin.com/i3iPwYZv) – agent154
Powinieneś używać 'read' zamiast' buffer.Length' podczas wywoływania 'TransformFinalBlock' –
Wielkie dzięki! Przez ostatnią noc męczyłem się nad tym. Skończyło się na hakowaniu czegoś, co głupio wyglądało, żeby to zadziałało, ale nie mogłem przestać myśleć, że to było niepotrzebne. Dowiedziałem się, że to dlatego, że ostatnia tablica była w pełni czytana, nawet jeśli ostatnia porcja była za mała. W końcu udało mi się stworzyć nową tablicę bajtów dla ostatniego elementu, która równa się wielkości ostatniego fragmentu. – agent154