Avatar billede psychopixi Nybegynder
16. april 2008 - 22:23 Der 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?
Avatar billede arne_v Ekspert
16. april 2008 - 22:30 #1
Ja. Det er muligt.

srand tager saa vidt jeg ved en 32 bit integer som seed.

Saa der er kun 4.2 milliarder mulige vaerdier.

Det er hurtigt brute forcet !
Avatar billede psychopixi Nybegynder
16. april 2008 - 22:34 #2
Tak for hurtigt svar.

Hurtigt som i sekunder, minutter eller timer?
Avatar billede arne_v Ekspert
16. april 2008 - 22:35 #3
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.
Avatar billede psychopixi Nybegynder
16. april 2008 - 22:38 #4
Hvordan vil du ellers dekryptere uden at kende indputtet til srand? kræver bruted dekryptering at du kender til krypteringsmetoden/algoritmen?
Avatar billede psychopixi Nybegynder
16. april 2008 - 22:45 #5
Anyways.. Du har svaret på mit spørgsmål - tak for det:)

Smid et svar for at få point.
Avatar billede arne_v Ekspert
16. april 2008 - 22:47 #6
Hvis det er nemt at genkende det ikke krypterede, saa vil jeg gaette paa faa timer til
en brute force.
Avatar billede arne_v Ekspert
16. april 2008 - 22:47 #7
og et svar
Avatar billede arne_v Ekspert
19. april 2008 - 21:26 #8
Prøv evt. at lege lidt med dette program:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

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;
}
Avatar billede arne_v Ekspert
19. april 2008 - 21:26 #9
Bemærk at det nogen gange finder den rigtige tekst med en forkert key, hvilket må betyde
at flere værdier til srand giver samme rand sekvens.
Avatar billede psychopixi Nybegynder
20. april 2008 - 14:16 #10
Mange tak:)

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.

Jeg tænker især på linien:
  if(s[i] == 'r' || s[i] == 'n' || s[i] == 'd' || s[i] == 's' || s[i] == 't')

Er grunden til at du søger efter r, n, d, s og t at det forventes at de optræder flest gange, eller hvordan?
Avatar billede arne_v Ekspert
20. april 2008 - 15:03 #11
'e' og ' ' er de to hyppigste bogstaver

de andre 5 er også meget hyppige
Avatar billede psychopixi Nybegynder
20. april 2008 - 15:33 #12
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'?
Avatar billede arne_v Ekspert
21. april 2008 - 02:08 #13
indtil 'e' og ' ' udgør mindst 20% af tegnene og de andre 5 også udgør mindst 20% af tegnene
Avatar billede psychopixi Nybegynder
23. april 2008 - 17:50 #14
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester