Szyfrowanie danych - XOR

TKW

Szyfrowanie danych jest znanym tematem. Nie będę tłumaczyć jego celu.

Jedną z metod szyfrowania jest XOR. W C zapisuje się go a^b, a w ASM XOR a,b, co daje wynik do a.

Tablica prawdy dla tego działania:

a b a^b
0 1 1
1 0 1
0 0 0
1 1 0

XOR więc daje wynik 1 dla różnych bitów.

Warto pamiętać, że znając dwie liczby z powyższej tabeli można określić trzecią.

a==(ab)b - w tym równaniu można zredukować XOR

Wynika z tego bardzo prosta rzecz:

Szyfrowanie: Deszyfrowanie:
a=ab; a=ab;

Więc procedura szyfrowania (i deszyfrowania) ciągu wygląda tak:

void xorproc(char* array, char key, int size)
{
    int n=0;
    while(n<size)
    {
        array[n]=array[n]^key;
        n++;
    };
    return;
}

Oczywiście, zmienna char może mieć 256 różnych wartości, wystarczy tyle razy szyfrować ciąg, aby go odszyfrować bez znajomości klucza.

Jeden ze sposobów szyfrowania ciągów ciągami to kolejne szyfrowanie kolejnym elementem ciągu klucza. Ten sposób zastosowałem w AtB ACD 0.1, 1.0, 1.1.

Deszyfrowanie tym sposobem wymaga oczywiście odwrócenia ciągu klucza.

Szyfrowanie pliku polega na pobraniu pliku do ciągu, i później ciągu do pliku.

To mój pierwszy artykuł, więc może zawierać błędy.

10 komentarzy

Widocznie mnie nie znasz! xor\'a można używać do sprawdzania czy dane flagi są ustawione. Mianowiecie jeśli mamy dany obiekt i metodę do ustawiania flag, to możemy szybko sprawdzić czy flagi są tak samo ustawione jak w przekazywanym argumencie. Może przykład:

int flag;  // globalna flaga zawierająca ustawienia wyświetlania grafiki 3D

int ustaw(int flaga)
{
if (flaga^flag==0) return -1; else        // jeśli te same ustawienia wyjdź
{

flag=flag | flaga;
// cały blok kodu sprawdzania pojedyńczych flag i ustawiania właściwości
// np:

if (flag & g_pelnyekran){
UstawPelnyEkran();
}

}
return 1;
}

Zaletą tego jest szybkie i efektywne sprawdzanie czy trzeba sprawdzać wszystkie flagi i niepotrzebnie uruchamiać jakieś funkcje. Może znacie inny szybszy sposób. I nie prawda, że xor\'a używa się tylko do kryptografii. Pozdrawiam
int flag; // globalna flaga zawierająca ustawienia wyświetlania grafiki 3D

int ustaw(int flaga)
{
if (flaga^flag==0) return -1; else // jeśli te same ustawienia wyjdź
{

flag=flag | flaga;
// cały blok kodu sprawdzania pojedyńczych flag i ustawiania właściwości
// np:

if (flag & g_pelnyekran){
UstawPelnyEkran();
}

}
return 1;
}



Zaletą tego jest szybkie i efektywne sprawdzanie czy trzeba sprawdzać wszystkie flagi i niepotrzebnie uruchamiać jakieś funkcje. Może znacie inny szybszy sposób. I nie prawda, że xor\'a używa się tylko do kryptografii. Pozdrawiam

A propos "a==(ab)b"

Można wymienić dwie zmienne (obojętnej wielkości) między sobą nie używając przy tym trzeciej pomocniczej:

a ^= b;
b ^= a;
a ^= b;

Dzięki temu nie mamy żadnej utraty danych.

ale fakt faktem popieram przedmowcow tego sie nie uzywa

Chyba że umiesz wygenerować w 100% losowy klucz o tej samej długości co szyfrowana wiadomość.

Czysto teoretycznie, wtedy wiadomość jest absolutnie niemożliwa do odszyfrowania bez klucza.

W praktyce... kiedyś odgadłem raz jaki będzie następny bajt z /dev/urandom ;]

To jaki sposób szyfrowania polecacie?

Faktem jest, że funkcja xor to podstawa matematyki ale, że nikt jej nie używa to przesada! Chrzanicie jak żaba o księżycu. Weżcie jakikolwiek szyfr blokowy lub strumieniowy: na pewno jest tam XOR, a OneTimePad jest praktycznie niełamalnym szyfrem, Office używa szyfru strumieniowego XOR. Weźcie też tryby pracy CBC, CFB i OFB.
Nie znasz się, to się nie wtrącaj.

Z czwartego od końca akapitu wynika, że autor to stosuje (lub stosował).

w sumie wstyd sie przyznac ale kiedys w jednym programiku zakodowalem cos w xorze ale fakt faktem popieram przedmowcow tego sie nie uzywa

w sumie nikt nie uzywa, jednak XOR do do dzisiaj jest jedna z podstawowych operacji elementarnych w wiekszosci kryptosystemow...
a co do samego arta.... ech.. nie powiem

Setny art o xorze... tylko kto tego używa? Nie znam nikogo takiego...

autor chyba był w śpiączce przez jakieś 15 lat :)