Szyfrowanie/deszyfrowanie za pomocą XOR

Szyfrowanie/deszyfrowanie za pomocą XOR
0

Witam, Próbuję zrealizować proste szyfrowanie/deszyfrowanie XORem (to moje pierwsze zetknięcie z szyfrowaniem a nie ograniam tych szyfrowań AES itp. więc chciałem zrobić chociaż takie nieskomplikowane jak XOR),
Potrzebuję zrobić to tak by wynik szyfrowania był w zakresie ASCII ( od '!' do '~') tzn potrzebuje się pozbyć "dziwnych" znaków które mogę powodować problemy przy przesyłaniu stringów RS232 (np.znak końca linii).

Na razie mam to zrobione w taki sposób:

Kopiuj
var
  i, j, kluczdl, x,y: Integer;
  str, str2, klucz: String;
  b,c : char;
  a: char;
  licz: Integer;
begin
  str := Edit3.Text;
  klucz := Edit2.Text;
  kluczdl := Length(klucz);
  j := 1;
  str2 := '';
  for i := 1 to Length(str) do begin
    b := str[i];
    x := ord(b);
    y := ord(klucz[j]);
    y := y - 23;
    c := Chr( x xor y );
    str2 := str2 + c;
    inc(j);
    if j > kluczdl then j := 1;
  end;

Edit4.Text := str2;

end;

To co mi przychodzi do głowy to zmiana: c := Chr(33 + (x xor y) ); to nam powinno "zabezpieczyć" zakres ASCII od dołu a z góry ? I jak to potem odszyfrować prawidłowo ?

edytowany 1x, ostatnio: flowCRANE
KR
xor to nie szyfrowanie, co najwyżej obfuskacja - nie polecam tego robic w praktyce.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:41 minut
  • Lokalizacja:Tuchów
  • Postów:12167
0

Podstawowe pytanie – jaki jest dopuszczalny zakres znaków wejściowych?

Poczytaj też o Base64.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
0

Zakres danych wejściowych jest taki sam jak chce uzyskać wyjściowych czyli ASCII ( od '!' do '~')

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:41 minut
  • Lokalizacja:Tuchów
  • Postów:12167
0

Samym xor-em nic nie zdziałasz, bo jeśli ciąg wejściowy oraz ciąg klucza zawierają wyłącznie znaki z przedziału <33;126>, to xor-owanie zwróci kody z przedziału <0;127>, czyli pełne ASCII. Prosty tester:

Kopiuj
var
  Min: UInt8 = 255;
  Max: UInt8 = 0;
  Code: UInt8;
var
  X, Y: Char;
begin
  for X := '!' to '~' do
    for Y := '!' to '~' do
    begin
      Code := UInt8(X) xor UInt8(Y);

      if Code < Min then Min := Code;
      if Code > Max then Max := Code;
    end;

  WriteLn('Min: ', Min);
  WriteLn('Max: ', Max);
end.

Na wyjściu dostajemy:

Kopiuj
Min: 0
Max: 127

Albo skorzystaj z sensownego algorytmu szyfrującego, albo klucz generuj w taki sposób, aby xor-owanie nie generowało znaków kontrolnych. Choć to może być awykonalne.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
0

aha ... kiepskie pociesze, szukałem czegoś innego np. AES, ale nie mogłem znaleźć sensownej implementacji z łopatologicznym wytłumaczeniem jak tego użyć.

Ogólnie to potrzebuje tego szyfrowania do zabezpieczenia transmisji po RS232 między prockiem avr a PC. Do avr znalazłem biblioteki tutaj: http://dominik.cc/projekty/avr-aes/

Ale jak to ogarnąć po stronie Delphi to nie wiem :(

KA
  • Rejestracja:prawie 21 lat
  • Ostatnio:12 dni
  • Postów:700
0

Przecież jeżeli nie musisz sam tego pisać to do AESów itp. masz pełno gotowych bibliotek :)


Kto nigdy nie zrobił var dupa niech pierwszy rzuci kamień.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:41 minut
  • Lokalizacja:Tuchów
  • Postów:12167
0
nowumfor napisał(a):

aha ... kiepskie pociesze […]

Dlaczego? Rozwiązanie najprawdopodobniej istnieje. Wystarczy tylko wykazać, że dla dowolnego ciągu wejściowego spełniającego wymagania (co do zawartości), istnieje skończona liczba ciągów kluczy, dla których ”szyfrowanie” xor-em nie zwróci ani jednego znaku kontrolnego.

Jak chcesz i masz czas to napisz sobie taki tester i wykaż, że da się to wykonać.

Ogólnie to potrzebuje tego szyfrowania do zabezpieczenia transmisji po RS232 między prockiem avr a PC. Do avr znalazłem biblioteki tutaj: http://dominik.cc/projekty/avr-aes/

W przypadku algorytmów szyfrowania przyjęło się, aby nie stosować własnych implementacji, bo nie jest to bezpieczne. Popularne i powszechnie wykorzystywane algorytmy zostały wielokrotnie sprawdzone pod kątem bezpieczeństwa przez mądre głowy, więc ich użycie jest jak najbardziej sensowne i zalecane.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
0

ok. Zmieniłem w kodzie wyżej

Kopiuj
Code := 33 + ((UInt8(X) xor UInt8(Y))  mod 94);

Teraz są znaki z zakresu: <33;126>

Problem teraz jak "wymyślić" odkodowanie tego działania ?

To proszę o wskazanie gdzie tego szukać żeby było sensownie wyjaśnione jak tego użyć bo powiedzenie że tęgie głowy wymyśliły nie jedno i wszystko jest u wujka google, to można byle co znaleźć, ale dla ludzi tak zielonych w temacie implementacja tego nie jest łatwa.

edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:41 minut
  • Lokalizacja:Tuchów
  • Postów:12167
0

W ten sposób nie dasz rady – operacja modulo nie jest odwracalna, więc przy odkodowywaniu nie da się określić, czy dodać do bazowego kodu 94, czy nie.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
0

Koniec końców po całym dniu "zabawy" udało mi się znaleźć i zaimplementować kodowanie Base64 nie bogate to ale zawsze i co najważniejsze działa

0

Jedna rzecz wyszła w czasie działania.. mianowicie wygląda mi na to że długość dekodowanego stringa jest ograniczona. Mógłby ktoś zobaczyć co tutaj należy zmienić żeby dekodować dłuższe stringi ?

Kopiuj
int Base64decode(char *bufplain, char *bufcoded)
{
    int nbytesdecoded;
    register const unsigned char *bufin;
    register unsigned char *bufout;
    register int nprbytes;

    bufin = (const unsigned char *) bufcoded;
    while (pr2six[*(bufin++)] <= 63);
    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
    nbytesdecoded = ((nprbytes + 3) / 4) * 3;

    bufout = (unsigned char *) bufplain;
    bufin = (const unsigned char *) bufcoded;

    while (nprbytes > 4) {
    *(bufout++) =
        (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
    *(bufout++) =
        (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
    *(bufout++) =
        (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
    bufin += 4;
    nprbytes -= 4;
    }

    /* Note: (nprbytes == 1) would be an error, so just ingore that case */
    if (nprbytes > 1) {
    *(bufout++) =
        (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
    }
    if (nprbytes > 2) {
    *(bufout++) =
        (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
    }
    if (nprbytes > 3) {
    *(bufout++) =
        (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
    }

    *(bufout++) = '\0';
    nbytesdecoded -= (4 - nprbytes) & 3;
    return nbytesdecoded;
}
0

sory niemogę skasować ... a olśniło mnie że zrobiłem błąd w innym miejscu programu ;)

WI
  • Rejestracja:około 7 lat
  • Ostatnio:2 miesiące
  • Postów:138
0

Możesz stowrzyc plik binarny - bez nagłówka losowy klucz i szyfrować wg niego wszystko, zapisywać również binarnie. Następnie odwrócić proces... jeśli zgubisz taki klucz to nikt tego nie odszyfruje już.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)