/ / Odszyfrowanie XOR dwóch ciągów tekstu jawnego - java, szyfrowania, binarnego, xor

Odszyfrowanie XOR dwóch ciągów tekstu jawnego - java, szyfrowania, binarnego, xor

W mojej klasie AP Java zostałem przydzielony do odszyfrowania następujących elementów: umzDlBF8aFix

za pomocą następującego klucza: oE2dpffzEiFD

Jedynym problemem jest to, że nie wiem, jak wykonać XOR, aby je odszyfrować. Doszedłem do tego, że zmieniłem je w binarne:

klawisz: 101000 | 000100 | 110110 | 011101 | 101001 | 011111 | 110011 | 000100 | 100010 | 000101 | 000011

tekst zaszyfrowany: 110110 | 100110 | 110011 | 100101 | 000001 | 111100 | 011010 | 000101 | 100011 | 110001

ale nie wiem, co z tym zrobić. Gdybyś mógł mi w tym pomóc, byłoby świetnie! Kod byłby również miły, ale nie potrzebny.

Stukrotne dzięki!

Odpowiedzi:

0 dla odpowiedzi № 1

Nie musisz zamieniać ich w pliki binarne. XOR jest operacją bitową, więc możesz XOR dwa bajty razem, i to będzie jak XOR każdy bit jednego bajtu z odpowiednim bitem drugiego bajtu.

Wystarczy napisać pętlę od zera do (i z wyłączeniem)długość szyfru, w którym odczytujesz każdy znak z szyfru, XOR z odpowiednim znakiem z klucza i dołącz wynik do StringBuilder. Następnie wywołaj .toString() na StringBuilder, aby uzyskać wynik.

Jeśli twój kompilator skarży się, że nie może znaków XOR, to rzuć każdy z nich char do a byte, wykonaj XOR między bajtami, a następnie rzutuj wynik na a char.

The String klasa ma charAt() metoda, która pozwala uzyskać postać zokreślony indeks w ciągu. Alternatywnie możesz zacząć od uzyskania zawartości każdego łańcucha jako tablicy char. (Jest do tego inna funkcja).

Jako bonus możesz to zrobić tak, jak robi to klucznie muszą być tej samej długości co szyfr. Możesz zachować osobne znaki adresowania indeksu szyfru, a gdy ten indeks osiągnie długość szyfru, możesz ustawić go z powrotem na zero, zaczynając w ten sposób odczytywać szyfr od początku.


0 dla odpowiedzi nr 2

Operator XOR ma właściwość T XOR K.XOR K == T, więc jeśli chcesz zaszyfrować zwykły tekst T za pomocą klucza K, zastosuj operację C = T XOR K, a aby odszyfrować tekst, musisz ponownie zastosować tę samą operację (T = C XOR K). Możesz zastosować operację XOR do każdego bajtu w tekście jawnym za pomocą pętli for lub funkcjonalnej mapy programowania.

EDYCJA: w razie potrzeby operator XOR w językach programowania jest reprezentowany przez znak „^”, więc A ^ B oznacza A XOR B.

EDYCJA 2: prosty dowód, że T XOR K XOR K == T, po prostu nie musisz tego akceptować jak magii:

  • K XOR K wyraźnie wynosi 0
  • T XOR 0 wyraźnie równa się T
  • Ponieważ operator XOR jest asocjatywny wraz z liczbami binarnymi, możemy zapisać T XOR K XOR K jako T XOR (K XOR K) == T XOR 0 == T

0 dla odpowiedzi № 3

Jak zauważyli inni, „xor” jest cudownymechanizm szyfrowania, ponieważ szyfrowanie i deszyfrowanie są dokładnie tą samą operacją. Jeśli użyjesz każdej części klucza tylko raz, masz najbezpieczniejszy algorytm szyfrowania.

Jeśli ponownie użyjesz dowolnej części klucza, zamieni się on w jeden z najgorszych mechanizmów szyfrowania, ponieważ ułatwia złamanie.

Problem, który tu masz, to - jak idzieszod znaków do wartości, którą chcesz zaszyfrować. Możesz wziąć wartości znaków Unicode, ale uzyskasz fałszywe wyniki za pomocą tekstu zaszyfrowanego i klucza. Problem z używaniem Unicode w stanie obecnym polega również na tym, że po szyfrowaniu / odszyfrowaniu możesz uzyskać znaki niedrukowalne, co zwykle nie jest problemem, ale przykłady podręczników trudno jest drukować znaki niedrukowalne.

Aby odszyfrować tekst, założyłem, że tłumaczenie znaków działa w ten sposób.

  • A - Z => 0–25
  • a - z => 26–51
  • 0 - 9 => 52–61

(Nie musiałem zgadywać, co to będzie 62/63, ale spacja i punkt byłyby dobrym domysłem).

Korzystając z tego założenia i xor, biorę twój zaszyfrowany tekst umzDlBF8aFix i twój klucz oE2dpffzEiFD i kończą się zwykłym tekstem GiFeMeaPenny.

Ponieważ jest to czytelny angielski - „Daj mi grosz„- wygląda na to, że powyższe założenia są wiarygodne.