Dzisiaj kolejna porcja kodu i programowania w C++. Pokażemy jak wygenerować losowy ciąg ze zdefiniowanych znaków i go przetasować (tak jak tablice elementów). Wielu osobom może to się przydać do losowania pseudolosowego stringa, który możemy użyć jako klucz do szyfrowania o w miarę unikalnym rozkładzie znaków. Funkcja genText() może dodatkowo posłużyć komuś do losowania sobie silnych haseł :-). Motywacją do napisania tej funkcji i publikacji źródła była chęć kontynuowania poprzedniego wpisu o szyfrowaniu xor i pisaniu cryptera. Z połączeniu obu funkcji mamy już generowanie automatyczne dosyć fajnego klucza szyfrującego o zdefiniowanej przez nas długości no i samo szyfrowanie XOR. W jednym z kolejnych wpisów połączymy to w całość.
Dodatkowo dodamy funkcje dopisywania tego zaszyfrowanego pliku naszym losowym kluczem do innego pliku. W ten sposób powstanie pewnego rodzaju binder/crypter/packer zmniejszający za każdym razem wykrywalność pliku (FUD) i łączący plik wykonywalny z np. zdjęciem w formacie jpeg.
Generowanie pseudoloswego stringa && tasowanie
Dzisiaj przedstawiamy kompletny kod źródłowy kompilowany i sprawdzany w Code::Blocksie i Netbeansie. Zezwalamy na użytkowanie go za darmo w dowolnych waszych projektach. Kod jest naszym autorskim algorytmem i dosyć bogato skomentowany, więc nawet początkującym adeptom programowania w C++ nie sprawi problemu zrozumienie go.
/* * File: genText.cpp * Author: haker.edu.pl * License: MIT (X11) * Created on 10 pazdziernika 2015 * genText(int, bool) - generate random string && shuffles array (buffor) */ #include <iostream> #include <cstdlib> #include <ctime> #include <cstring> using namespace std; const char * genText(int max, bool potasuj = true) { /* * Funkcja generuje losowy ciąg. * -argument max to długość wygenerowanego ciągu * -argument potasuj aktywuje dodatkowe przemieszanie ciagu (domyslny argument) */ //Cztery tablice z roznymi typami znakow. Mozna modyfikowac! char tab0[] = "abcdefghijklmnopqrstuvwxyz"; char tab1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char tab2[] = "0123456789"; char tab3[] = "!@#$%^&*(),."; //Tablica flag z uzytymi juz tablicami. Zapewnia rownomierny rozklad uzycia wszystkich tablic z znakami podobna ilosc razy) bool vistTab[] = {0, 0, 0, 0}; //Zwracany ciag string buffor; srand(time(NULL)); //Petla generowania znak po znaku for (int i = 0; i < max; i++) { //Sprawdz czy wszystkie 4 tablice juz uzyte byly, jesli tak to zezwol ponownie na wylosowanie wszystkich tablic if (vistTab[0] == true && vistTab[1] == true && vistTab[2] == true && vistTab[3] == true) vistTab[0] = vistTab[1] = vistTab[2] = vistTab[3] = false; //Sprawdz czy wylosowany typ tablicy nie byl juz wykorzystywany, jak byl to losuj inna int randTab; do { randTab = rand() % 4; } while (vistTab[randTab] == true); vistTab[randTab] = 1; int sizeTab = 0; int nr; //Zaleznie od wylosowanej powyzej tablicy ze znakami, losuje z niej znak i dopisuje go do buffora switch (randTab) { case 0: sizeTab = sizeof (tab0) / sizeof (tab1[0]) - 1; nr = rand() % sizeTab; buffor += tab0[nr]; break; case 1: sizeTab = sizeof (tab1) / sizeof (tab1[0]) - 1; nr = rand() % sizeTab; buffor += tab1[nr]; break; case 2: sizeTab = sizeof (tab2) / sizeof (tab2[0]) - 1; nr = rand() % sizeTab; buffor += tab2[nr]; break; case 3: sizeTab = sizeof (tab3) / sizeof (tab3[0]) - 1; int nr = rand() % sizeTab; buffor += tab3[nr]; break; } } //Dodatkowe przetasowanie (mieszanie pseudolosowe/shuffles array). Zapewnia jeszcze lepszy rozklad znakow (OPCJONALNE)! //Losuje dwa elementy z wygenerowane ciagu (buffor) i zamienia je miejscami. Zmienna vmax okresla ilosc takich przetasowan //cout << buffor << endl; //odkomentowujac mozesz sprawdzic jak wyglada bez przetasowania if (potasuj == true) { int vmax = max * 4; char randA; char randB; char tmp; for (int i = 0; i <= vmax; i++) { randA = rand() % max; randB = rand() % max; tmp = buffor[randA]; buffor[randA] = buffor[randB]; buffor[randB] = tmp; } } //------------------------------------------------ return buffor.c_str(); } int main() { cout << genText(64, true); return 0; }
Schemat blokowy losowania tekstu
Poniżaj dodatkowo dla chętnych umieszczam uproszczony schemat blokowy działania tego algorytmu. Sklecony w krótkiej przerwie na kolanie w samochodzie ;-). Implementacja została w pełni odzwierciedlona w C++. W poniższym schemacie blokowym brakuje tylko przetasowania tablicy (shuffles array), którą zdecydowałem się dodać później jako opcjonalna dodatkowa funkcja zwiększająca losowość ciągu.
Inne wpisy które mogą Ciebie zainteresować:
Zapraszamy również na naszego fejsbuka HakerEduPL, aby być na bieżąco :-).
Sporo artykułów już :), a żeby było więcej polecam coś napisać o metasploice, jak napisać exploita i shellcode. Tyle wiedzy ile przeciętny czytacz przyswoił może przejść na hight-level
Było już troszkę, poszukaj „szkoła hakerów” na naszym blożku. Ale na pewno jeszcze coś się pojawi, bo to temat rzeka.