2015-12-25 22 views
6

Co potrzebne jest odwracalny funkcja przekształca długi (64-bitową liczbę całkowitą) w inny długi liczby, w taki sposób, że wydaje się "losowy" dla użytkownika (ale w rzeczywistości jest deterministyczny), tak że 3 kolejne liczby są przekształcane na 3 liczby zupełnie różne od siebie.odwracalny funkcja „skrót” z 64-bitową liczbę całkowitą 64-bitową liczbę całkowitą

Łatwo jest to zrobić bez odwracalności, ale okazuje się, że jest to dość trudne, jeśli chodzi o tę część.

Zasadniczo jest to to samo pytanie co Reversible hash function?, ale potrzebuję więcej niż 2^32 odrębnych wartości.

Wszelkie pomysły?

PS: Mam zamiar napisać to na Jawie, ale samo pytanie jest dość ogólne.

+0

Tak. Po prostu rób to, co zrobili dla drugiego pytania, ale rób to dla 64 bitów zamiast 32 bitów. – m69

+0

Hash/suma kontrolna to ulica jednokierunkowa. Są zaprojektowane tak, aby były nieodwracalne. Szukasz szyfru. – Krythic

Odpowiedz

8

Są to podstawowe wymagania dotyczące szyfr blokowy, który jest zazwyczaj realizowany w strukturę Feistel: https://en.wikipedia.org/wiki/Feistel_cipher

  1. Tworzenie mieszania dolnych 32 bitów i XOR je w górnych 32 bitów
  2. Zmienne dolny i górny 32 bity
  3. Powtórz kilka razy.
3

Możesz użyć dowolnego 64-bitowego szyfru blokowego (na przykład DES) i użyć szyfrowania dla "hash" i odszyfrować dla "reverse hash".

0

Jeśli bezpieczeństwo nie jest twoją troską i potrzebujesz tylko wizualnie losować liczby, naprawdę szybkim rozwiązaniem jest użycie zwykłego XOR ze stałym kluczem w twoim kodzie. Aby go odzyskać, po prostu XOR ponownie z tym "tajnym" kluczem.

Jeśli interesuje Cię bezpieczeństwo, ale nie masz ograniczeń miejsca, możesz użyć większych klawiszy (np. Przesuwny XOR) lub nawet OTP. Here to przykład Java OTP.

Chciałbym również podkreślić dwa następujące przypadki, w których już proponowane rozwiązania wykorzystujące pewne algorytmy szyfrowania symetrycznego (nawet proste XOR lub OTP) mogą nie działać zgodnie z oczekiwaniami.

  1. Jeśli musimy utrzymać znak liczby
  2. Jeśli musimy utrzymać wielkość liczby (np mam numer 5digit i chcę pokazać swój odwracalny randomizowanych 5 cyfrowy numer wersji (lub przynajmniej blisko do jego wielkości (4-6))

aby wspierać powyższe wymagania, polityki opartej zmodyfikowany XOR/OTP, który odnosi się tylko do wymaganych bitów, może być dobrym kandydatem.

+1

to wcale nie jest "losowa", jeśli istnieją pewne binarne relacje między numerami wejściowymi. –

+0

Tak, całkowicie zgadzam się, możesz zastosować bardziej złożoną strategię zwiększania losowości, ale poziom losowości zależy od tego, co OP chce osiągnąć. Zaznaczam, że jest po prostu wizualnie losowy, a nie bitowy; w przeciwnym razie odpowiedź jest oczywista, potrzebujesz bezpiecznego algorytmu szyfrowania! –

0
static long GMULL = 0x9E3779B97F4A7C15L; 
static long GDIVL = 0xF1DE83E19937733DL; 
static long GADDL = 0xABCDEFL; 
public static long golden64fwd(long key) { 
    key *= GMULL; 
    key += GADDL; 
    return key; 
} 

public static long golden64rev(long key) { 
    key -= GADDL; 
    key *= GDIVL; 
    return key; 
} 

static int GMULI = 0x9E3779B9; 
static int GDIVI = 0x144CBC89; 
static int GADDI = 0x; 
public static int golden32fwd(int key) { 
    key *= GMULL; 
    key += GADDL; 
    return key;   
} 

public static int golden32rev(int key) { 
    key -= GADDI; 
    key *= GDIVI; 
    return key;   
} 

Jeśli chodzi o właściwości mieszania, to jest w najlepszym razie średnie. GMUL [I, N] to przybliżony złoty współczynnik dla 64 i 32 bitów. GDIV [I, N] to odpowiedni multiplikatywny rozmiar odwrotny mod 2 ^. GADD [I, N] jest liczbą nieparzystą. Są liczby, które są kolejne, a ich "zakodowane" wartości są również bardzo bliskie. Ale wątpię, by były trzy z rzędu.

Powiązane problemy