2010-10-27 11 views
10

Potrzebuję wskazówek lub praktycznego przykładu szyfrowania int do innej int, a tajny klucz będzie wymagany do odszyfrowania wartości.Symetryczna liczba całkowita do szyfrowania całkowitoliczkowego

Coś jak:

encrypt(1, "secret key") == 67123571122 
decrypt(67123571122, "secret key") == 1 

Ten facet pyta prawie to samo pytanie: Symmetric Bijective Algorithm for Integers
jednak mnie jest całkowite szyfrowanie „n00b” Chciałbym trochę więcej praktycznych przykładów, w Pythonie, jeśli to możliwe.

Rozumiem, że muszę używać jakiegoś szyfru blokowego, ale jestem całkiem stracił na części o utrzymanie zaszyfrowany wynik nadal być numeryczny i dość krótki (może długo zamiast int)

Wszelkie wskaźniki? Dzięki

UPDATE- Dlaczego chcę to zrobić?
Mam usługę internetową, gdzie każdy „obiekt” dostaje adres URL, np .: example.com/thing/123456/

Teraz te identyfikatory są sekwencyjne. Chcę ukryć fakt, że są sekwencyjne (identyfikatory bazy danych).

Rzeczy na tych stronach nie są "ściśle tajne" ani nic w tym stylu, ale nie powinno być tak łatwo, aby ktoś wślizgnął się do jakiegoś innego przypadkowego obiektu, jak tylko zwiększył ten identyfikator w adresie URL.

W przypadku dwukierunkowego szyfrowania numerycznego identyfikatory adresów URL nie będą w ogóle sekwencyjne, a znalezienie tych obiektów zajęłoby sporo czasu. (Ponadto żądania są ograniczane)

Jedynym powodem, dla którego chcę zachować ten numeryczny, a nie dowolny ciąg, jest to, że zmiana jest całkowitym zamiennikiem kropli, a rzeczy będą działać bez żadnych innych zmian kodu.

Ponadto nie mogę po prostu wygenerować nowych losowych identyfikatorów bazy danych. Muszę obsługiwać to szyfrowanie/odszyfrowywanie w aplikacji.

+2

Dlaczego to robisz? Jaki jest cel? Tworzenie własnej kryptografii jest bardzo niebezpieczne. Nawet zwodniczo proste rzeczy, takie jak "po prostu używaj szyfrów X", mogą mieć nieoczekiwane konsekwencje dla bezpieczeństwa. –

+0

Dobra uwaga. Zaktualizowałem pytanie: – adamJLev

+0

[Format Preserving Encryption] (http://en.wikipedia.org/wiki/Format-preserving_encryption) –

Odpowiedz

3

To zależy od tego, jak bezpiecznie kryptograficznie chcesz być. Dla niezbyt bardzo bezpiecznego (w sensie kryptograficznym - prawdopodobnie dobrze do codziennego użytku, jeśli nie spodziewasz się poważnego ataku), działa XOR ze stałym kluczem tajnym. Po prostu pamiętaj, że będzie on podatny na dość podstawowe kryptoanalizy.

Jeśli potrzebujesz prawdziwego szyfrowania, prawdopodobnie będziesz musiał użyć szyfru strumieniowego, takiego jak RC4. Możesz pobrać 32 bity klucza i XOR z wartością, aby je zaszyfrować. Tak długo, jak otrzymasz nowy 32-bitowy strumień klucza dla każdej wartości, wszystko będzie w porządku.

RC4 ma jednak pewne zastrzeżenia, więc najpierw przeczytaj na ten temat.

Szyfrowanie blokowe nie będzie w tym przypadku twoim przyjacielem, ponieważ wszystkie mają rozmiary bloków 64-bitowych lub więcej. Oznacza to, że musisz dodać 32-bitową liczbę całkowitą do 64 bitów, a otrzymasz 64 bity z powrotem ... ale nie możesz wybrać, które 32 zachować. Nie będzie można odszyfrować go za pomocą tylko połowy bitów. Jeśli chcesz przenieść się do longów, możesz użyć 3DES lub Blowfish.

Wszystko zależy od tego, co dokładnie szyfrujesz i dlaczego, więc trudno jest udzielić jednoznacznej odpowiedzi. Mam nadzieję, że da to wyobrażenie, od czego zacząć.

+1

+1 dla 64-bitowego szyfru blokowego. Mam przykład kodu tego tutaj: http://stackoverflow.com/questions/3569783/query-string-parameter-obfuscation/3571165#3571165 Również 64-bitowa liczba całkowita reprezentowana jako hex ma tylko 16 znaków i powinna być dobrze do użytku w adresie URL. –

0

Chcesz zaszyfrować tylko jeden "int", czyli q 32/64 bitowy numer?
Następnie najprościej jest po prostu wykonać XOR za pomocą tajnego klucza 32/64.

+0

Alternatywnie, zamień go na XOR z mniejszym kluczem, powtórzonym na przestrzeni numeru. –

+0

Jaki kod będzie wyglądał mniej więcej? – adamJLev

+0

należy zachować ostrożność, używając prostego xor ponieważ wtedy mając tylko 64 przykłady, użytkownik może znaleźć klucz. –

1

Możesz obejrzeć ten dokument: Perfect Block Ciphers with Small Blocks i the slides prezentacji na konferencji FSE 2007.

W artykule wyjaśniono, w jaki sposób losowo wybrać permutację n elementów (np. Liczbę całkowitą między 0 a n-1), które można wyświetlić jako szyfr dla tego zestawu n elementów.

1

Odpowiedź, którą zamieściłem na to pytanie, dotyczy również Twojej: użyj krótkiego szyfru blokowego. Zakładając, że twoje identyfikatory są 64-bitowe, w rzeczywistości możesz po prostu użyć szyfru XTEA tak jak jest, z 64-bitową liczbą całkowitą jako blokiem danych.

+0

Brzmi to wystarczająco dobrze, a kod XTEA wygląda na tyle prosty, że można go łatwo przenieść do Pythona. Tak, zrobię to – adamJLev

0

Prosta funkcja XOR nie może być nazywana szyfrowaniem. Obfuskacja jest bardziej odpowiednim słowem. Opracowałem kompaktowy, szybki i miejmy nadzieję, bezpieczny algorytm, który nazywam Ayden. Jest w domenie publicznej i can be downloaded from Github. Mam nadzieję, że jest to przydatne.

Powiązane problemy