Moja metoda szyfrowania danych #1

Witaj! To co czytasz to mój pierwszy post, więc proszę cię o pozostawienie opinii w komentarzu.

W tym poście opowiem wam o mojej metodzie szyfrowania danych, a konkretnie tekstu. Nie ma tu nic zaskakującego, więc metoda jest prosta, bezstratna i działa w 2 strony.

Tak więc zaczynamy!

Szyfrowanie

Na samym początku przygotujemy sobie funkcję.

Pierwszym krokiem mojej metody szyfrowania jest odwrócenie tekstu. Zrobimy to dzięki klasie StringBuilder . Aby odwrócić tekst dzięki tej klasie tworzymy zmienną typu String . Następnie w tej zmiennej robimy nowy obiekt StringBuilder , gdzie jako argument dajemy mu nasz tekst, czyli txt . Następnie metodą reverse() odwracamy tekst. W tym momencie na pewno wyskoczy wam błąd, gdyż musimy ten obiekt zamienić na tekst metodą toString()

Kolejnym krokiem jest zamiana odwróconego tekstu na wartości heksadecymalne. Normalnie zmienilibyśmy go w coś typu: AF54 jednak moja metoda tworzy wartości AF 54 – każdy znak w zapisie heksadecymalnym (2 znaki hex na znak) jest oddzielony spacją.

W Javie nie znalazłem metody zamieniającej String na wartości heksadecymalne, więc napiszemy swoją. Wykorzystamy do tego klasę BigInteger . Jako argumenty podamy: 1 – gdyż pierwszy argument to znak, a 1 to dodatni oraz byte[] uzyskany z tekstu (metoda getBytes może wyrzucić UnsupportedEncodingException więc do funkcji dodamy throws UnsupportedEncodingException ). Aby z BigInteger uzyskać tekst potrzebujemy metody String.format . Jako pierwszy argument podamy %x ponieważ chcemy uzyskać liczbę w zapisie heksadecymalnym, a jako drugi nasz BigInteger Gdyby nie moje wydziwianie, z tymi spacjami, tu moglibyśmy skończyć, jednak jak już mówiłem, chcę mieć zapis: XY XY XY, a nie XYXYXY. Do tego musimy nasz string z wartościami hex zamienić na char[] , a następnie pętlą for dodać spację przed co 2 znak. Niestety jak wiadomo 0 modulo 2 to 0 więc na początku doda się spacja, ale usuniemy ją dzięki metodzie substring .

Przy okazji zrobimy sobie też metodę zwracającą wartości ASCII znaków. Na początku tworzymy sobie int[] , który będzie przechowywał nasze wartości ASCII. Jako wielkość tablicy podamy mu długość tekstu. Następnie za pomocą pętli for uzyskamy znaki char , które łatwo zamienić na wartości int .

Potrzebna będzie nam jeszcze funkcja zwracająca String z wartości ASCII, nie będę omawiał jak działa, gdyż jest podobna do tej, którą pokazałem przed chwilą.

W końcu możemy wrócić do naszej funkcji encrypt ! 😀
Na początku tworzymy sobie string z wartościami hex tekstu. Następnie ten string zamieniamy na wartości ASCII (nazwa: ascii). Przyda nam się też druga tablica (nazwa: ascii2), więc możemy wykorzystać metodę .clone() . I teraz cała zabawa się zaczyna. W pętli for zapisujemy następujący kod:
ascii2[i] = ascii[i]+13+i%10; – co to robi? Już mówię. Do wartości „i” z tablicy ascii2 przypisujemy wartość „i” z tablicy ascii + 13 (moja ulubiona liczba :p) + i%10 (bez tego nasz szyfr byłby łatwy do odczytania. Czemu nie dałem po prostu +i? Ponieważ po pewnym czasie może to wyjść poza zakres ASCII).

Ostatni krok to już tylko zamiana wartości ASCII na string, więc wrzucę tu już gotową funkcję 😀

Przykładowo zakodowane wartości:

  • Hello World – CB/Ft2JF5Ls.DG1DC4K|-Dr0Gu3JJ6AF
  • Programowanie – CC/FJ2Iy5L>. [email protected] /GC2HD
  • żółć ąę – [email protected] /sF2uw

W następnym poście pojawi się deszyfrowanie, gdyż ten post byłby za długi 🙂 Do zobaczenia wkrótce 😀

KuZu

Hej! Mam na imię Kuba, mam 14 lat. Piszę już kilka lat, głównie w Javie. Głównie piszę różne pierdółki, lecz tworzę też ciekawe projekty.

Zobacz wszystkie posty tego autora →

Komentarze

  • LudziE12

    Po pierwsze, w jednym paste masz błąd,
    Po drugie, to nie jest ASCII,
    Po trzecie, jest takie coś jak String.trim() ,
    „Wykorzystamy do tego obiekt BigInteger” powinno być: „Wykorzystamy do tego klasę BigInteger”
    😉

    • Jakub Żuchowski

      1. W którym, to poprawię.
      2. To co to jest, jeśli dla znaku ‚A’ zwraca 65 a dla kodu 91 znak ‚[‚ ? ( http://www.asciitable.com/ )
      3. Zapomniałem całkowicie o tym.
      4. Poprawione 😉

      • LudziE12

        Praktycznie wszystkie kodowania znaków mają bazę w ASCII dla zgodności. Z tego co pamiętam, to nie ASCII a UTF-16 (albo UTF-32, nie pamiętam który) 😉 http://www.fileformat.info/info/charset/UTF-32/list.htm
        W rozszerzonym ASCII nie masz znaku „ł” czy „ć”

        • Jakub Żuchowski

          Aa, to w takim razie zwracam honor 😉 Mam jeszcze pytanie, gdzie potrzebny jest mi tu String.trim(), bo nie za bardzo widzę tu zastosowanie dla niego.

          • Jakub Żuchowski

            Już wiem. Zamiast .substring(1)?

          • LudziE12

            tak, trim ucina białe znaki na początku i końcu Stringa

    • Jakub Żuchowski

      Zanim poprawię, to admin musi go zdjąć, bo zwykły śmiertelnik nie może edytować sobie od tak postów 😉

  • Kamil Koczurek

    „retutn”
    Człowiek całe życie uczy się czegoś o Javie, zawsze myślałem, że „return” a tu taka niespodzianka.

    To coś to nie jest szyfr, tylko wymyślony na poczekaniu badziew, nie szyfrowałbym czymś takim nawet listy bananów, które ostatnio zjadłem. Jedyny sens istnienia takiego wybryku „natury” (?) to albo nauka (dla siebie), albo bycie samo w sobie. Wrzucenie tego na stronę dla rzekomych programistów powinno być karane stryczkiem.

    • Łukasz Bownik

      Są choćby algorytm Vigenere’a 😉 wystarczy użyć klucza, którego nie będziesz w stanie odtworzyć i już masz taki co działa w jedną stronę 🙂

      • Kamil Koczurek

        Jeśli z matematycznego punktu widzenia nie mogę odtworzyć tego co było poddane jakiejś operacji to to nie jest szyfr, tylko hash. Każdy szyfr działa w dwie strony, bo jeśli nie można odkodować wiadomości to nie została zaszyfrowana tylko popsuta.

        • Łukasz Bownik

          Poczytaj na Wikipedii ze Ellwod Shannon dowiodl iz szyfr Vigenere’a jest szyfrem nie do zlamania przy konkretnych warunkach 😉 jak napisales ponizej najpierw trzeba „cos” umiec a dopiero potem zaczynac cos robic 🙂

          • Kamil Koczurek

            Każdy szyfr jest nie do złamania w odpowiednich warunkach? Odnoszę się tylko do tego, że jeśli ktoś (docelowo odbiorca) może odkodować wiadomość, to algorytm działa w dwie strony i tym samym jest szyfrem.

          • Łukasz Bownik

            Zakodowac to nie zaszyfrowac 😉 i coz… Shannon dowiodl tylko szyfru Vigenere’a wiec jezeli uwazasz ze wiesz lepiej niz Shannon i dowiedziesz ze analiza znakowa sie wtedy nie da odgadnac klucza to szacun 😀

          • Łukasz Bownik

            Poza tym jak liczysz na cos bardziej zaawansowanego to nie wchodz na nasteoletnich tylko do bardziej zaawansowanego srodowiska koderow bo jednak nazwa portalu mowi o tym ze nie znajdziesz tu bardzi wiele materialow advanced :p

          • Kamil Koczurek

            Grupa NP na facebooku niejednokrotnie pozytywnie mnie zaskoczyła, ale jak widać ludzie ogarnięci w temacie nie mają jakiejś wielkiej ochoty na pisanie tutaj. Choć oczywiście kilka takich ładnych i przyjemnych postów było.

            Kod nie wykracza poza alfabet, ale nie wiem co to ma do rzeczy. Każdy szyfr jest w odpowiednich warunkach niełamalny i jednocześnie każdy możemy złamać, wiedząc jakiego użyto algorytmu. W pierwszym przypadku możemy założyć, że nie jesteśmy w stanie trywialnie sprawdzić, czy udało nam się uzyskać oryginalną wiadomość – w takim wypadku jeśli klucz był przekazany w odpowiedni sposób nie jesteś w stanie złamać szyfru. Bo co jak co, ale same dane wyjściowe nic nie rozgryziesz, to tak jakbyś miał rozwiązać równanie „2x = y” nie znając ani ‚x’, ani ‚y’. Jednocześnie złamanie czegokolwiek (znając algorytm) jest w teorii wykonalne, wystarczy sprawdzać po kolei wszystkie możliwe klucze i weryfikować czy uzyskany ciąg jest np. jakąś względnie poprawną językowo wiadomością.

    • Łukasz Bownik

      I to jest szyfr, tylko nie skomplikowany, a jeżeli uważasz, że wiesz co to szyfr to poczytaj o DES i AES 😉 to w takim razie są szyfry 🙂

      • Kamil Koczurek

        Nie trzeba się od razu rzucać na głęboką wodę, po prostu wg mnie wypadałoby znać jakieś granice. Mniej-więcej te, które oddzielają zabawkę do napisania w 2 minuty od czegoś czym warto się chwalić.

        • Łukasz Bownik

          Ale zeby cos sie nauczyc trzeba od czegos w danej dziedzinie zaczac 🙂 po prostu, nie nauczy sie szyfrowania jesli nie zrobi najpierw kodu na Cezara potem modyfikujac na Vigenere’a az na koniec zrobi cos jak AES

          • Kamil Koczurek

            A czy ja mówię, żeby nie robił? Osobiście bardzo się cieszę, że ktoś uczy się programowania, zwłaszcza w kontekście kryptografii. Inna sprawa, kiedy wbijam sobie na stronkę nastoletni.pl licząc na interesujące wpisy dotyczące jakichś bardziej zawiłych algorytmicznie lub trudnych w implementacji spraw a dostaję… to.

          • Albert221

            Ciężko na tym etapie starać się o bardzo quality content. Jednak cały czas na tym pracujemy 🙂

    • Jakub Żuchowski

      Co do „retutn” to każdemu może zdarzyć się literówka 🙂 Och… przez mój „wybryk natury” i przez to, że „uczę się tydzień i nwm” wywołałem gównoburzę… W takim razie, jak zaleciłeś postaram się o karę w postaci stryczka dla mnie 😉 A tak poza tym, napisałem, że „Piszę już kilka lat, głównie w Javie.” i skoro „wrzucenie tego na stronę dla rzekomych programistów (…) powinno być karane stryczkiem”, to co robią ci administratorzy, którzy zatwierdzili ten post… ciekawe 😉 A i skoro ten post to dno i powinienem się nauczyć podstaw, to co ten post jeszcze tu robi? 😉

      • Kamil Koczurek

        @Albert221:disqus nie wyjaśnił ładnie, że „Ciężko na tym etapie starać się o bardzo quality content”? Dlatego to tutaj jest, żeby strona nie była praktycznie całkiem pusta. Masz to kilka komentarzy niżej.

        „Piszę już kilka lat, głównie w Javie”
        Przykra sprawa.

        „wywołałem gównoburzę”
        Nie, to też ci nie wyszło. Chyba, że jakoś źle patrzę w sekcję komentarzy, ale oboje wiemy, że tak nie jest.

    • Jakub Żuchowski

      A jeśli nie wiesz o co chodzi z „+13+i%10 to ci mogę wyjaśnić. +13 dodaje do kodu ascii (WIEM, że to nie jest ASCII tylko któryś z UTF) liczbę 13, więc np. zamiast MAMA mamy ZNZN, a +i%10 dodaje do tego resztę z dzielenia i przez 10, czyli było MAMA, potem ZNZN, a teraz będzie ZOP. Nie rozumiem beki 🙂

      • Kamil Koczurek

        „mogę wyjaśnić”
        Dzięki, nie zrozumiałem i stąd moje hejterskie „XD”.

        „Nie rozumiem beki :)”
        Prawie mi przykro.

        • PodróżnikPoInternecie

          Dziwne, że nikt jeszcze tego nie usnął XD

          • Kamil Koczurek

            A rzeczywiście, ciekawa sprawa. 😀