2009-06-06 19 views
7

W jaki sposób można niedrogo dwukierunkowe szyfrowanie 32-bitowej int, tak, że każda liczba jest odwzorowywana do innej int w tej przestrzeni iz powrotem w sposób trudny do przewidzenia?Sposób szyfrowania pojedynczego int

I nie wymaga wstępnego przechowywania 4.29 miliardów intów w tabeli mapowania.

+0

Zobacz także http://stackoverflow.com/questions/858476/12-digit-number-java-encryption-question To nie jest dokładnie to samo, ale to samo rozumowanie ma zastosowanie, aby wyjaśnić, dlaczego nie jest to bezpieczne. – erickson

+3

erickson: "Niezabezpieczony" zależy od kontekstu. Nie ma żadnych błędów a priori w przypadku "szyfrowania" 32-bitowych znaków, o ile nie można przeprowadzić ataku z użyciem wybranego tekstu jawnego. –

Odpowiedz

18

Potrzebny jest 32-bitowy szyfr blokowy. Niestety, większość szyfrów blokowych ma 64 bity lub więcej ze względu na weaknesses of a short block size. Jeśli potrafisz obsłużyć zaszyfrowaną int będącą dwa razy większą od danych wejściowych, możesz po prostu użyć Blowfish, TDES lub jakiegoś innego dobrze sprawdzonego 64-bitowego szyfru blokowego.

Jeśli naprawdę potrzebujesz 32 bitów i nie masz nic przeciwko zmniejszonemu bezpieczeństwu, to jest to łatwe do przycięcia szyfru sieci Feistel, jak Blowfish, aż do dowolnej długości bloku, która jest wielokrotnością 2 i mniejszą niż początkowy szyfr.W przypadku Blowfish wystarczy podzielić liczbę wejściową równomiernie między dwie połówki bloków i przyciąć wyjście funkcji F oraz wartości P do 1/2 rozmiaru bloku docelowego. Można to zrobić po kluczowaniu algorytmu jak zwykle.

+1

To musi być jedyna rozsądna odpowiedź na cały wątek. Gratulacje! ;) –

6

Oczywiście potrzebny jest jakiś losowy klucz, aby był bezpieczny. W takim przypadku:

int original = 42; 
int key = give_me_a_random_int(); 

int encrypted = original^key; 
int unencrypted = encrypted^key; 

// now, unencrypted == original == 42 

To tylko proste XOR. XORing ponownie odwróci ten proces.

Należy również zauważyć, że jest to bezpieczne tylko do jednego użytku. Nazywa się to One time pad. Jeśli użyjesz tego samego klucza dwukrotnie w przypadku nieprzypadkowych danych, osoba atakująca może je odszyfrować.

+3

to działa, jeśli klucz zostanie użyty tylko raz. – hiena

+4

Jeśli w zwykłym tekście występują jakieś wzorce lub odchylenia, pojawią się one, gdy dwie wiadomości, które zostały zaszyfrowane tym samym kluczem, są XORD razem. (A^K)^(B^K) = A^B. – erickson

+2

Również 2^32 nie jest bardzo dużą przestrzenią klucza do brutalnej siły. – laalto

1

Jednym ze sposobów jest XOR z tajnym 32-bitowym numerem. Kiedy ponownie prześlesz ten tajny numer, nastąpi powrót do pierwotnego numeru. Jest to szybkie, ale niezbyt bezpieczne. Jeśli potrzebna jest bezpieczna metoda, byłbym zainteresowany również innymi metodami.

+0

Zakładając, że klucz jest tajny i losowy, prawdopodobnie jest to bezpieczne. – Zifre

+2

To jest bardzo niebezpieczne: XORing dwóch numerów wyjściowych razem będzie produkować XOR z dwóch liczb wejściowych, ujawniając wiele o źródle i ewentualnie pozwalając atakującemu dowiedzieć się, co to jest tajemnica. –

+1

Miałem na myśli jedną liczbę. Jest to NAJBARDZIEJ bezpieczna metoda jednorazowego użytku (patrz Jednorazowa tablica). – Zifre

-1

Użyłem XOR + ADD z kluczem tajnym 64-bitowym. Ja również zmieniałem klucz co kilka minut i próbowałem odszyfrować kluczem bieżącym lub poprzednim. (W mojej domenie liczba całkowita nie musi być bezpieczna przez więcej niż około 4 minut.)

0

Istnieją dwie proste i odwracalne operacje, których można użyć do scalenia wartości całkowitych. Możesz użyć operacji xor i możesz zamienić bity w liczbie.

Jeśli użyjesz obu, to nie będzie to takie proste, aby zrozumieć zastosowaną metodę. Będą się trochę chronić.

+2

Zasadniczo zalecamy, aby osoba pytająca wymyśliła swój własny szyfr blokowy. To wygląda na złe podejście. –

+1

Jest szybki i prosty, więc działa całkiem nieźle, jeśli chcesz po prostu przetasować wartość. Oczywiście nie ma to większego wpływu na prawdziwe szyfrowanie, ale tak naprawdę nie jest to możliwe z ograniczeniami podanymi w pytaniu. – Guffa

+1

Oczywiście - użyj szyfru blokowego, jak sugerował inny plakat. Nie ma powodu, by rzucać własnymi rękami. –

0

Jeśli wszystko, czego chcesz, to coś naprawdę prostego, czego przeciętny użytkownik nie zauważy, to użyj serii operatorów XOR i zmianowych.

Problem z brakiem użycia tablicy do zapisania 4 miliardów wartości INT jest taki, że potrzebna jest funkcja, która wykonuje losową mapę o wartości 1 do 1 w domenie o wartości 4 miliardów INT. Możesz mieszać kilka operatorów XOR i zmian, aby stworzyć własne, ale nie będzie to trudne do złamania. Nawet gdyby istniała dobrze znana jedna na jedną mapę, również byłaby nieskuteczna. Bez soli ktoś mógłby po prostu wygenerować prosty tęczowy stół, by go złamać.

Problem z solą w komunikacji dwukierunkowej polega na tym, że musisz ją bezpiecznie przekazać. Sole muszą być tajne, a kiedy już wiesz, jakie one są, są bezcelowe.

Jeśli chcesz skonfigurować bezpieczny kanał komunikacji, spójrz na numer Off-the-Record Messaging Protocol version 2. Daje to przykład tego, jak złożone może być szyfrowanie komunikacji. Proponuję znaleźć coś dobrze znanego, że ktoś już stworzył i przetestował. Nawet jeśli użyjesz czegoś, co ktoś inny stworzył, jeśli użyjesz go niepoprawnie, zawiedzie.

1

Użyj standardowego algorytmu i losowej podkładki (zakładając, że tekst zaszyfrowany nie musi mieć tej samej długości co tekst płaszczyzny).

W zasadzie użyj standardowego algo, które używa łańcucha i podłącz cztery losowe 32-bitowe liczby przed nim. To powinno pomóc w ukryciu wszelkich prawidłowości/nadmiarowości w wiadomości 32-bitowej. Do diabła, pad na końcu, jeśli ci się podoba.

Zasadniczo im mniej piszesz, tym lepiej. Wszyscy to robią.

+0

"Każdy wkręca te rzeczy", tak samo jest z wynalazkiem własnego krypto _scheme_. –

+0

Wynalazłem wektor inicjalizacyjny? Od _Applied Cryptography_ firmy Schneier, strona 194 Niektóre wiadomości mają wspólny nagłówek: nagłówek lub wiersz "od" lub cokolwiek innego. O ile powtórzenie bloku nadal będzie niemożliwe, ten identyczny początek może dostarczyć użytecznych informacji o kryptoanalityku. Zapobiegaj temu, kodując dane losowe jako pierwszy blok. Ten blok losowych danych nazywa się wektorem inicjującym (IV). –

+1

Tak, ale zasugerowałeś kilka bloków wartości, co jest bezcelowe, biorąc pod uwagę, że stan bloku szyfru ma tylko jeden blok długości. Nie ma to również zastosowania, gdy OP chce zmapować 32-bitowy int do innego 32-bitowego int. –

0

Weź 32-bitowe wejście, wytnij na dwie 16-bitowe połówki L i R, a następnie powtórz następujące kroki: obliczyć pseudolosową funkcję R, xor lub wynik tej funkcji pseudolosowej na L i zamienić L i R. Jest to konstrukcja Luby-Rackoff. Funkcja pseudolosowa nie musi być odwracalna. Więc możesz na przykład wziąć szyfr blokowy, zaszyfrować 16 bitów i przeciąć wynik na 16 bitów. Upewnij się, że nie wszystkie rundy używają tej samej pseudolosowej funkcji (rsp. Użyj różnych okrągłych klawiszy).

0

Zapraszamy do obejrzenia: projekt github.com/msotoodeh/integer-encoder. Obsługuje 32 i 64-bitowe liczby całkowite.

Powiązane problemy