2015-10-12 6 views
1

Я хочу найти внутреннее состояние RC4 по значению массива грубой силы RC4, но я не уверен, как это сделать.Как перебрать силу для поиска внутреннего состояния на RC4?

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

typedef unsigned long ULONG; 

void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) 
{ 
    int i = 0, j = 0; 
    char k[256] = { 0 }; 
    unsigned char tmp = 0; 
    for (i = 0; i<256; i++) { 
     s[i] = i; 
     k[i] = key[i%Len]; 
    } 
    for (i = 0; i<256; i++) { 
     j = (j + s[i] + k[i]) % 256; 
     tmp = s[i]; 
     s[i] = s[j]; 
     s[j] = tmp; 
    } 
} 

void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) 
{ 
    int i = 0, j = 0, t = 0; 
    unsigned long k = 0; 
    unsigned char tmp; 
    for (k = 0; k<Len; k++) { 
     i = (i + 1) % 256; 
     j = (j + s[i]) % 256; 
     tmp = s[i]; 
     s[i] = s[j]; 
     s[j] = tmp; 
     t = (s[i] + s[j]) % 256; 
     Data[k] ^= s[t]; 
     printf("%d\n ", Data[k] ^= s[t]); //May be I have to brute force here 
    } 
} 

int main() 
{ 
    unsigned char s[256] = { 0 }; //S-box 
    char key[256] = { "12345678" }; 
    char pData[512] = "testRC4"; 
    ULONG len = strlen(pData); 
    printf("key : %s\n", key); 
    printf("raw : %s\n", pData); 

    rc4_init(s, (unsigned char *)key, strlen(key)); 
    rc4_crypt(s, (unsigned char *)pData, len); 
    printf("encrypt : %s\n", pData); 

    rc4_init(s, (unsigned char *)key, strlen(key)); 
    rc4_crypt(s, (unsigned char *)pData, len); 
    printf("decrypt : %s\n", pData); 
    getchar(); 
    return 0; 
} 

В строке printf ("% d \ n", Данные [k]^= s [t]); показать значение, подобное этому.

116, 101, 115, 116, 82, 67, 52

Я не уверен, что я должен перебираю это значение или какую линию я должен изменить для грубой силы для поиска внутренних состояние RC4. пожалуйста помогите.

+0

'данных [K] = s [т]; printf ("% d \ n", Data [k]^= s [t]); 'prints' Data [k] 'и не изменять его. Это то, что вы хотите сделать? – MikeCAT

ответ

0

116, 101, 115, 116, 82, 67, 52 является ASCII для "testRC4", то есть ваш незашифрованном значение

Ваш Е() заявление фактически изменив данные обратно на оригинал из-за. ..

Data[t] ^= s[t] 

Это назначение и имеет значение r. Итак, вы сначала меняете Data [t], затем берете новое значение и печатаете его. Но как раз перед этим, вы устанавливаете значение с тем же выражением. ((N^Y) = Y) == N.

Изменить ваш Printf к ...

printf("%d\n",Data[t]); 

 Смежные вопросы

  • Нет связанных вопросов^_^