Próbuję zbudować dwie funkcje za pomocą PyCrypto, które akceptują dwa parametry: wiadomość i klucz, a następnie zaszyfrują / odszyfrują wiadomość.
Znalazłem w sieci kilka linków, które mogą mi pomóc, ale każdy z nich ma wady:
Ten w codekoala używa os.urandom, którego PyCrypto odradza.
Co więcej, klucz, który podam do funkcji, nie gwarantuje, że będzie miał dokładną oczekiwaną długość. Co mogę zrobić, aby to się stało?
Jest też kilka trybów, który z nich jest zalecany? Nie wiem czego użyć: /
Wreszcie, czym właściwie jest IV? Czy mogę podać inny IV do szyfrowania i odszyfrowywania, czy może to zwróci inny wynik?
Edycja : Usunięto część kodu, ponieważ nie była bezpieczna.
/dev/urandom
na UniksieOdpowiedzi:
Oto moja implementacja i działa dla mnie z kilkoma poprawkami i ulepsza wyrównanie klucza i tajnej frazy z 32 bajtami i iv do 16 bajtów:
źródło
Możesz potrzebować następujących dwóch funkcji:
pad
- dounpad
blokowania (podczas szyfrowania) i - do usuwania (podczas deszyfrowania), gdy długość danych wejściowych nie jest wielokrotnością BLOCK_SIZE.Więc pytasz o długość klucza? Możesz użyć sumy md5 klucza, zamiast używać go bezpośrednio.
Co więcej, zgodnie z moim małym doświadczeniem w używaniu PyCrypto, IV jest używany do mieszania danych wyjściowych szyfrowania, gdy dane wejściowe są takie same, więc IV jest wybierany jako losowy ciąg i używa go jako części wyjścia szyfrowania, a następnie użyj go do odszyfrowania wiadomości.
A oto moja implementacja, mam nadzieję, że będzie dla Ciebie przydatna:
źródło
pad
funkcja jest zepsuta (przynajmniej w Py3), zamieńs[:-ord(s[len(s)-1:])]
na, aby działała w różnych wersjach.Pozwól, że odpowiem na Twoje pytanie dotyczące „trybów”. AES256 to rodzaj szyfru blokowego . Przyjmuje jako dane wejściowe 32-bajtowy klucz i 16-bajtowy ciąg, zwany blokiem i wysyła blok. Używamy AES w trybie pracy w celu szyfrowania. Powyższe rozwiązania sugerują użycie CBC, co jest jednym z przykładów. Inny nazywa się CTR i jest nieco łatwiejszy w użyciu:
Jest to często określane jako AES-CTR. Radziłbym ostrożność w używaniu AES-CBC z PyCrypto . Powodem jest to, że wymaga określenia schematu wypełnienia , czego przykładem są inne podane rozwiązania. Ogólnie rzecz biorąc, jeśli nie jesteś bardzo ostrożny z dopełnieniem, istnieją ataki, które całkowicie łamią szyfrowanie!
Teraz ważne jest, aby pamiętać, że klucz musi być losowym, 32-bajtowym ciągiem ; hasło nie wystarczy. Zwykle klucz jest generowany w następujący sposób:
Klucz może również pochodzić z hasła :
Niektóre powyższe rozwiązania sugerują użycie SHA256 do wyprowadzenia klucza, ale jest to ogólnie uważane za złą praktykę kryptograficzną . Sprawdź Wikipedię, aby dowiedzieć się więcej o trybach działania.
źródło
Dla kogoś, kto chciałby używać urlsafe_b64encode i urlsafe_b64decode, oto wersja, która działa dla mnie (po spędzeniu trochę czasu z problemem Unicode)
źródło
Możesz uzyskać hasło z dowolnego hasła, używając kryptograficznej funkcji skrótu ( NIE wbudowanej w Pythonie
hash
), takiej jak SHA-1 lub SHA-256. Python zawiera obsługę obu w swojej standardowej bibliotece:Możesz skrócić kryptograficzną wartość skrótu, używając tylko
[:16]
lub,[:24]
a zachowa ona swoje zabezpieczenia do określonej długości.źródło
Wdzięczny za inne odpowiedzi, które zainspirowały mnie, ale nie zadziałały.
Po spędzać czas próbuje dowiedzieć się, jak to działa, wpadłem na realizację poniżej z najnowszej PyCryptodomex biblioteki (jest to inna historia, jak udało mi się ustawić go za pełnomocnika, w systemie Windows, w sposób virtualenv .. uff)
pracujących na swojej implementacji pamiętaj, aby zapisać dopełnienie, kodowanie, kroki szyfrowania (i odwrotnie). Trzeba pakować i rozpakowywać pamiętając o kolejności.
źródło
Dla dobra innych, oto moja implementacja deszyfrowania, do której doszedłem, łącząc odpowiedzi @Cyril i @Marcus. Zakłada się, że to przychodzi za pośrednictwem żądania HTTP z cytowanym tekstem zaszyfrowanym i zakodowanym w standardzie Base64.
źródło
Inne podejście do tego (silnie wywodzące się z powyższych rozwiązań), ale
testowane z Pythonem 2.7 i 3.6.5
źródło
Użyłem zarówno
Crypto
iPyCryptodomex
biblioteki, jak i błyskawicznie ...źródło
Jest trochę późno, ale myślę, że będzie to bardzo pomocne. Nikt nie wspomniał o schemacie użycia takim jak dopełnienie PKCS # 7. Możesz go użyć zamiast poprzednich funkcji, aby padać (kiedy robisz szyfrowanie) i unpad (kiedy robisz deszyfrowanie) .i dostarczy pełny kod źródłowy poniżej.
źródło
kompatybilne kodowanie utf-8
źródło
źródło