mam następujący przykład zastosowania:Czy jest możliwe skopiowanie algorytmu HashAlgorith .NET (dla powtarzających się przyrostowych wyników mieszania)?
- czytano n bajtów z pliku
- obliczeniowej (MD5) mieszania dla tych n bajtów
- odczytywania następnego m bajtów z pliku
- obliczeniowej (MD5) mieszania dla pliku do n + m bajtów
Przyrostowo hashowanie pliku nie jest problemem, just call TransformBlock
and TransformFinalBlock
.
Problemem jest to, że muszę kilka skrótów danych, które podzielają jego początku bajtów, ale po nazwałem TransformFinalBlock
przeczytać Hash
pierwszych n
bajtów I nie może być kontynuowana do mieszania z tego samego przedmiotu i potrzebują nowego.
Poszukiwanie problemu, widziałem, że zarówno Python jak OpenSSL mieć możliwość skopiowania obiektu mieszającego dokładnie tym celu:
hash.copy()
zwrócić kopię ("Klon") obiektu mieszającego. Ten może być użyty do wydajnego obliczania skrótów łańcuchów, które mają wspólny początkowy podciąg.
EVP_MD_CTX_copy_ex() może być używany do kopiowania komunikat strawienia stan z się do wyjazdu. Jest to przydatne, jeśli duże ilości danych mają zostać zaszyfrowane , które różnią się tylko kilkoma ostatnimi bajtami. out należy zainicjować przed wywołaniem tej funkcji.
Searching jak mogę, nie mogę znaleźć nic withing Giełdzie C# HashAlgorithm które pozwoliłyby mi skutecznie Clone()
== skopiować taki obiekt przed wywołanie metody TransformFinalBlock
- a potem dalej do obliczenia skrótu resztę danych z klonem.
Znalazłem C# reference implementation for MD5, który może być trywialnie przystosowany do obsługi klonowania (*), ale zdecydowanie wolałby używać tego, co jest, zamiast wprowadzać takie rzeczy do bazy kodów.
(*) W istocie, o ile mi zrozumieć, dowolny Hashing Algorithm (w przeciwieństwie do szyfrowanie/deszyfrowanie) Mam jedno, aby sprawdzić to trywialnie copyable bo cały stan taki algorytm ma to formę strawić.
Więc czegoś tu brakuje, czy też standardowy interfejs C#/.NET nie oferuje sposobu na skopiowanie obiektu haszującego?
Kolejny punkt danych:
Microsoft własny natywne API dla crypto services posiada funkcję CryptDuplicateHash
, docs, które stwierdzają, cytuję:
Funkcja CryptDuplicateHash mogą być wykorzystywane do tworzenia oddzielne hashe z dwóch różnych treści, które zaczynają się od tej samej treści.
Występuje od czasów systemu Windows XP. : - |
Uwaga wrt. MD5: przypadek użycia nie jest wrażliwy na kryptografię. Po prostu niezawodne sprawdzanie plików.
Jedna sprawa z tym, że nie jest trywialnie klonowana, niektóre klasy mogą korzystać z zasobów natywnych lub wywoływać wyspecjalizowany sprzęt z uchwytami. Te typy klas nie byłyby tak łatwe do sklonowania. –
@Scott - Dzięki. Tak, myślę, że niektóre klasy mogą. Jednak te, które * nie *, jak MD5, powinny być naprawdę klonowalne. Więc nie ma mowy? –
Wygląda na to, że jeśli chcesz nawet płytkiej kopii, będziesz musiał iterować całość i sam ją stworzyć. –