16. april 2008 - 22:23Der er
13 kommentarer og 1 løsning
Brute force
Hej eksperter. Jeg har lavet en meget simpel krypteringsalgoritme, der beregner en sum ud fra en krypteringstreng indtastet af brugeren (altså et password). Denne integeriske værdi indsætter jeg i windows' random generator (srand) og bruger derefter XOR mellem en random værdi med udgangspunkt i passwordet og det det skal krypteres, fx:
krypteret[x] = ikke_krypteret[x] ^ random%256;
Mit spørgsmål er om det er muligt at brute force denne kode, da der jo i princippet ikke er nogen gentagelser fra kodeordet? Og hvis det kan lade sig gøre, hvor lang tid ville det så kunne tage?
Bemaerk ioevrigt at rand normal er implementeret via en LCG algoritme og ifoelge Knuth er der en svaghed i brug af LCG genererede tilfaeldige tal til kryptering.
Saa maaske er det ikke engang noedvendigt med brute force.
void endecrypt(char *s1, char *s2, int l, int k) { int i; srand(k); for(i = 0; i < l; i++) { s2[i] = s1[i] ^ (rand() % 256); } s2[l] = '\0'; }
int countesp(char *s, int l) { int res,i; res = 0; for(i = 0; i < l; i++) { if(s[i] == 'e' || s[i] == ' ') { res++; } } return res; }
int countrndst(char *s, int l) { int res,i; res = 0; for(i = 0; i < l; i++) { if(s[i] == 'r' || s[i] == 'n' || s[i] == 'd' || s[i] == 's' || s[i] == 't') { res++; } } return res; }
int analyze(char *s, int l) { int k; char *buf; buf = (char *)malloc(l); k = 0; for(;;) { endecrypt(s, buf, l, k); if(countesp(buf, l) > l/5 && countrndst(buf, l) > 1/5) { free(buf); return k; } k++; } }
int main() { int l, k, k2; char p[200], c[200], p2[200], p3[200]; printf("Enter key number: "); scanf("%d", &k); strcpy(p, "Dette er en lille test af hvor nemt det er at analysere en simpel RNG baseret kryptering"); l = strlen(p); printf("%s\n", p); endecrypt(p, c, l, k); endecrypt(c, p2, l, k); printf("%s\n", p2); k2 = analyze(c, l); printf("key=%d\n", k2); endecrypt(c, p3, l, k2); printf("%s\n", p3); return 0; }
Det ville hjælpe mig enormt, hvis du kunne forklare nærmere hvordan analyserings-delen fungerer, da jeg på denne måde kunne tage det med i mit eksamensprojekt.
Konseptet går altså ud på at du bliver ved at prøve en værdi til srand indtil hver gang man har fem bogstaver er der mindst et 'e' eller mellmrum og mindst et 'r', 'n', 'd', 's' eller 't'?
Du har været en meget stor hjælp i mit programmeringsprojekt - så tak for det.
Jeg har forresten fundet ud af at srand ikke retunerer samme sekvens ud fra forskellige seed værdier, men når man arbejder med meget korte sætninger som den i dit eksempel er der simpelthen ikke muligheder nok til at flere seeds ikke skulle generere samme sekvens.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.