[ antraks @ 25.01.2018. 14:20 ] @
Imam jedan mali problemcic s kojim se borim vec cijeli dan.
Moram da uradim AES kriptografski algoritam u openCL-u, sa svim koracima i fazama radi paralelizacije. Na pocetku trebam da ulazni tekst pretvorim
u blokove od 128bita (odnoscno matricu 4x4 heksadecimalnih vrijednosti).
Ali je problem sto ne znam kako da napravim tu matricu da sadrzi heksadecimalne vrijednosti.
Ucitao sam ulazni tekst u niz znakova (char *) i kad ih ispisem, ispise ih kao slova.
Code:

char* readFile(const char* filename)
{
    char* source;
    long length;
    FILE * f = fopen(filename, "r");
    if (f)
    {
        fseek(f, 0, SEEK_END);
        length = ftell(f);
        fseek(f, 0, SEEK_SET);
        source = (char*)calloc(length, sizeof(char));
        if (source)
            fread(source, 1, length, f);
        fclose(f);
    }
    return source;
}
int main(int argc, char* argv[]){
    char * ulaz= readFile("test.txt");
    cout<<ulaz<<endl;  //ispise normalan tekst kako je u txt falju
    long length=fileLength("test.txt");
    
    for(int i=0; i<length; i++)
    {
        cout <<hex << (int)ulaz[i]<<","; //ispisuje heksadecimalne vrijednosti koje trebam da stavim u blokove (matrice)
        
    }
}


Ovo je ulazni tekst
Code:

Finding the best price for the Lenovo Vibe P2 64GB is no easy task. Here you will find where to buy the Lenovo Vibe P2 64GB at the best price. 
Prices are continuously tracked in over 140 stores so that you can find a reputable dealer with the best price


Ovo je rezultat.

Code:

46,69,6e,64,69,6e,67,20,74,68,65,20,62,65,73,74,20,70,72,69,63,65,20,66,6f,72,20
,74,68,65,20,4c,65,6e,6f,76,6f,20,56,69,62,65,20,50,32,20,36,34,47,42,20,69,73,2
0,6e,6f,20,65,61,73,79,20,74,61,73,6b,2e,20,48,65,72,65,20,79,6f,75,20,77,69,6c,
6c,20,66,69,6e,64,20,77,68,65,72,65,20,74,6f,20,62,75,79,20,74,68,65,20,4c,65,6e
,6f,76,6f,20,56,69,62,65,20,50,32,20,36,34,47,42,20,61,74,20,74,68,65,20,62,65,7
3,74,20,70,72,69,63,65,2e,20,50,72,69,63,65,73,20,61,72,65,20,63,6f,6e,74,69,6e,
75,6f,75,73,6c,79,20,74,72,61,63,6b,65,64,20,69,6e,20,6f,76,65,72,20,31,34,30,20
,73,74,6f,72,65,73,20,73,6f,20,74,68,61,74,20,79,6f,75,20,63,61,6e,20,66,69,6e,6
4,20,61,20,72,65,70,75,74,61,62,6c,65,20,64,65,61,6c,65,72,20,77,69,74,68,20,74,
68,65,20,62,65,73,74,20,70,72,69,63,65,



Koju strukturu da napravim da bi to izgledalo ovako? I kako napraviti da bude bas blok (matrica) heksadecimalnih vrijednosti?? Jer kada ih ovako ispisujem
tretiraju se kao integeri od 4 bajta (32bita), a meni treba da to bude 1 bajt u heksadecimalnom obliku.
Mislio sam da napravim vector 2d nizova (tj matrica), ali ne znam koliko je to dobro i prakticno.

Code:

46,69,6e,64,
69,6e,67,20,
74,68,65,20,
62,65,73,74,

20,70,72,69,
63,65,20,66,
6f,72,20,74,
68,65,20,4c,

65,6e,6f,76,
6f,20,56,69,
62,65,20,50,
32,20,36,34,

47,42,20,69,
73,20,6e,6f,
20,65,61,73,
79,20,74,61,

..........





[ Branimir Maksimovic @ 25.01.2018. 15:35 ] @
Nisi bas jasan sta ti treba: da li hoces samo da formatizujes output ili da smestis u neku strukturu? Imas 128 bitne podatke u vidu SSE2 tipa __m128i pa tu svih 16 bajtova mozes da smestis, ali naravno mozes
da definises i niz od 16 karaktera ili niz nizova i slicno...
[ antraks @ 25.01.2018. 15:48 ] @
Trebam oboje. Malo sam konfuzno to napisao.
Trebam da tekst (niz znakova) koji ucitam kao slova (znakove), prvo pretvorim u niz heksadecimalnih vrijednosti. Pa nakon toga, od tog niza hex vrijednosti, da napravim neku strukturu ili slicno, koja ce sadrzati blokove tih hex vrijednosti.
Npr. prvi 16 hex vrijednosti (tj 128 bita) trebam staviti u matricu 4x4. Pa drugih 128bita u novu matricu i tako redom dok cijeli ulazni tekst ne podijelim u matrice (blokove).
I onda od tih matrica napraviti neku strukturu koja ce da sadrzi niz tih matric, nesto kao ArrayList-a u javi.
Jesam li sad uspio pojasniti kako treba?
[ Branimir Maksimovic @ 25.01.2018. 16:18 ] @
Nema potrebe nista da pretvaras u hex posto se podaci vec drze u binarnom obliku, mozes da printas u hex.
Sto se tice smestanja u niz 4x4 nizova evo ti primer:
Code:

#include <vector>
#include <fstream>
#include <stdio.h>
struct Cont {
    char rc[4][4];
};
int main() {
    typedef std::vector<Cont> vec_t;
    vec_t out;
    std::ifstream ifs("data.txt");
    while(ifs) {
        out.push_back(Cont());
        ifs.read((char*)out.back().rc,16);
    }
    for(const auto& v:out) {
        puts("");
        for (int i = 0;i<4;++i){
            for(int j = 0 ;j<4;++j)
                printf(" %x",v.rc[i][j]);
            puts("");
        }

    }
}

Ovo je C++11 lako mozes da pretabas ako ti treba C++ 98 ;)
[ antraks @ 25.01.2018. 16:34 ] @
Ali kasnije sve operacije koje trebam raditi su sa hex vrijednostima. Kako to onda uraditi? Nisam toliko vjest sa C++, pa mi treba zasad vise vremena da nesto uradim.
Pogledaj prezentaciju.
Aes

Hvala za ovaj dio koda. Tako nesto sam i mislio ali nisam toliko dobar u C++.
[ Branimir Maksimovic @ 25.01.2018. 17:07 ] @
Ma to samo prezentuju u hex obliku, kompjuter radi sve binarno ;p
[ antraks @ 25.01.2018. 17:44 ] @
Jasno mi je to, nego bi mi bilo mnogo lakse da postoji neki nacin da su bas hex vrijednosti. Jer ima SubBytes korak gdje mijenjam vrijednosti na osnovu lookup tabele. Pa ce to biti malo komplikovanije. A i sve ostalo.
Nema druge nego se napatiti, kad vec u glavi nema nista :))
[ mj7 @ 25.01.2018. 19:00 ] @
Mislim da si se skroz upetljao sa tipovima podataka i njihovom reprezentacijom. :) Kog tipa ti je ta lookup tabela?
[ antraks @ 25.01.2018. 21:15 ] @
Heksadecimalni brojevi. Problem je u tome sto ne znam kako uradio SubBytes korak. Jer mi tu trebaju hex vrijednosti da bih mogao ocitati iz tabele. Ako je npr jedan bajt 5B, moram pronaci 5 horizontalno i B uspravno i na presjeku uzeti taj broj i upisati umjesto 5B. Kontam kako to uraditi kad su druge vrijednosti. Jer bih morao izdvajati svaki nibl i gledati koja je vrijednost, pa traziti u tabeli pa onda opet pretvoriti da dobijem char.
A mozak mi se zakovao tako da nemam nekih novih ideja :)
[ Branimir Maksimovic @ 25.01.2018. 21:26 ] @
To je bar prosto:
Code:

#include <stdio.h>
#include <string.h>
int main() {
    char table[16][16]={0}; // init with something
    char toreplace[] = "this is string to replace";
    int len = strlen(toreplace);
    for (int i = 0;i<len;++i) {
        int v = toreplace[i] >> 4;
        int h = toreplace[i] & 0xf;
        toreplace[i] = table[v][h];
    }
}
[ dusans @ 25.01.2018. 21:31 ] @
A šta je tačno problem?
Uzmeš high nibble (5) i to ti je red u S-Box-u (5 dec).
Uzmeš low nibble (B) i to je kolona u S-Box-u (11 dec).
Setuješ vrednost byte-a tamo gde si sa vrednošću byte-a iz S-Box-a sa izračunatog reda/kolone.

Ajde još jednom - ne postoji hex zapis već samo pretvaranje iz binarnog u hex.
A binarni zapis možeš da posmatraš kao hex, oct, dec, šta ti već treba.
[ antraks @ 25.01.2018. 22:57 ] @
Citat:
dusans: A šta je tačno problem?
Uzmeš high nibble (5) i to ti je red u S-Box-u (5 dec).
Uzmeš low nibble (B) i to je kolona u S-Box-u (11 dec).
Setuješ vrednost byte-a tamo gde si sa vrednošću byte-a iz S-Box-a sa izračunatog reda/kolone.

Ajde još jednom - ne postoji hex zapis već samo pretvaranje iz binarnog u hex.
A binarni zapis možeš da posmatraš kao hex, oct, dec, šta ti već treba.


Problem je u nedovoljnom poznavanju C++. Najvise.

Citat:
Branimir Maksimovic: To je bar prosto:
Code:

#include <stdio.h>
#include <string.h>
int main() {
    char table[16][16]={0}; // init with something
    char toreplace[] = "this is string to replace";
    int len = strlen(toreplace);
    for (int i = 0;i<len;++i) {
        int v = toreplace[i] >> 4;
        int h = toreplace[i] & 0xf;
        toreplace[i] = table[v][h];
    }
}


Prosto je tebi. Meni bi malo duze trebalo da skontam to :)))
Pokusacu sada ovako kako ste predlozili. Sad vec otprilike znam kako bi trebalo ici sta. Hvala na pomoci.
[ antraks @ 28.01.2018. 22:15 ] @
Citat:
Branimir Maksimovic:
Nema potrebe nista da pretvaras u hex posto se podaci vec drze u binarnom obliku, mozes da printas u hex.
Sto se tice smestanja u niz 4x4 nizova evo ti primer:
Code:

#include <vector>
#include <fstream>
#include <stdio.h>
struct Cont {
    char rc[4][4];
};
int main() {
    typedef std::vector<Cont> vec_t;
    vec_t out;
    std::ifstream ifs("data.txt");
    while(ifs) {
        out.push_back(Cont());
        ifs.read((char*)out.back().rc,16);
    }
    for(const auto& v:out) {
        puts("");
        for (int i = 0;i<4;++i){
            for(int j = 0 ;j<4;++j)
                printf(" %x",v.rc[i][j]);
            puts("");
        }

    }
}

Ovo je C++11 lako mozes da pretabas ako ti treba C++ 98 ;)


Moze li nekako da ovo "punjenje" blokova bude nekako po kolonama? Da se popunjava vertikalno? Znao bih uraditi rucno ali ako znate neki mozda laksi nacin. Ili transponovati matrice (blokove)?

Napredujem polako s ostalim dijelovima. Hvala na pomoci.