2010-10-26 6 views
0

J'ai un texte en clair et j'ai le texte chiffré avec moi et ma tâche est de trouver la clé pour le texte chiffré déclaré. La clé est une liste de mots comme un dictionnaire. J'ai écrit le code en c et il compile parfait et crée le fichier avec tous les chiffrements. Le problème auquel je suis confronté est que chaque fois que je lance le code, un texte chiffré est complètement différent. Je n'ai aucune idée d'où je fais une erreur. Ce qui suit est le code que j'avais écritopenssl cryptage et décryptage en utilisant la bibliothèque evp

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <openssl/evp.h> 

int main() 
{ 
    int i; 
    char words[32], t; 
    FILE *key, *outFile; 
    const char *out = "Output.txt"; 
    unsigned char outbuf[1024 + EVP_MAX_BLOCK_LENGTH]; 
    unsigned char iv[] = "0000000000000000"; 
    int outlen, tmplen; 
    int num; 
    EVP_CIPHER_CTX ctx; 
    EVP_CIPHER_CTX_init(&ctx); 
    char inText[] = "This is a top secret."; 
    char cipherText[] = "8d20e5056a8d24d0462ce74e4904c1b513e10d1df4a2ef2ad4540fae1ca0aaf9"; 
    key = fopen("words.txt", "r"); 
    if(remove("ciphertext.txt") == -1) { 
    perror("Error deleting file"); 
    } 
    outFile = fopen("ciphertext.txt", "a+"); 
    if(key < 0 || outFile < 0) 
    { 
     perror ("Cannot open file"); 
     exit(1); 
    } 

    char pbuffer[1024]; 


    while (fgets(words,32, key)) 
    { 
     i=strlen(words); 
     words[i-1]='\0'; 
     //printf("%s",words); 
     i = 0; 
     EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, words, iv); 
     if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inText, strlen(inText))) 
     { 
      EVP_CIPHER_CTX_cleanup(&ctx); 
      return 0; 
     } 
     if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen)) 
     { 
      EVP_CIPHER_CTX_cleanup(&ctx); 
      return 0; 
     } 
     outlen += tmplen; 
     print_hex(outbuf, outlen, outFile); 
    } 
    fclose(key); 
    fclose(outFile); 
    return 1; 
} 

int print_hex(unsigned char *buf, int len, FILE *outFile) 
{ 
    int i,n; 
    char x='\n'; 
    for (i = 0; i < len; i++) 
    { 
     fprintf(outFile,"%02x",buf[i]); 
    } 
    fprintf(outFile,"%c",x); 
    return (0); 
} 

Depuis la clé est un mot. Les mots dans la liste de mots peuvent être de taille < ou> 16 octets et de mes recherches sur openssl il a été dit qu'il y aura un padk # 5 si la longueur du bloc ne rentre pas dans 16 octets. Est-ce le même cas pour la clé aussi.

Le texte chiffré que j'ai déclaré ne correspond pas au texte chiffré que je génère à partir du programme et je n'arrive pas à trouver la clé pour le texte chiffré.

J'ai besoin de l'aide des experts. Je vous serais reconnaissant si quelqu'un me aide à sortir de la peine

Merci à l'avance

Répondre

0

Qu'est-ce que vous en train d'essayer d'atteindre? Votre code ressemble à une tentative de mener une attaque par force brute en utilisant un dictionnaire de mots de passe ... Je ne suis pas sûr que je devrais essayer d'aider avec ça!

Je suppose que c'est juste un exercice ...

La première chose qui me frappe est que vous configurez votre vecteur d'initialisation (la variable iv) à une chaîne de zéros ASCII. C'est presque certainement faux, et vous avez probablement besoin d'utiliser des zéros binaires.

non signé char iv [16] = {0}; Je ne sais pas comment le texte chiffré que vous avez été généré (par un autre programme, probablement) mais j'imagine que ce programme n'a pas utilisé le mot du dictionnaire lui-même comme une clé, mais a traversé une sorte de clé processus de dérivation en premier. Vous utilisez l'AES 128 bits comme algorithme de chiffrement, vos clés doivent donc avoir une longueur de 16 octets. Comme vous le suggérez, vous pouvez le faire en complétant, comme vous le suggérez, mais il est plus habituel de passer par un processus qui mélange les bits de la clé pour lui donner un aspect plus aléatoire et distribuer les bits clés dans toute la clé. Il ne serait pas inhabituel de hacher le mot et d'utiliser la sortie de la fonction de hachage plutôt que le mot lui-même comme clé. Une autre possibilité est que le mot dictionnaire puisse être utilisé comme entrée d'une fonction de dérivation de clé basée sur une phrase secrète telle que celle définie dans PKCS # 5.

Vous avez vraiment besoin de savoir comment le mot est utilisé pour générer une clé avant de pouvoir aller plus loin avec cela.

0

Merci beaucoup pour la réponse.

Oui c'est juste un exercice et est comme une attaque de dictionnaire. Je suis censé utiliser iv avec des zéros mais pas ASCII zéro, ce qui est l'une des erreurs que j'ai faites. Je suppose que le texte chiffré donné est chiffré purement avec un mot de la liste de mots sans aucun hachage et peut-être être rembourré mais je ne suis pas sûr parce que je suis censé faire trouver la clé du texte chiffré. La liste de mots peut contenir des mots de moins de 16 octets ou des mots de plus de 16 octets. Donc, le problème que je pense pourrait être avec le rembourrage. Je pense peut être si la longueur du mot est inférieure à 16 octets, alors je dois remplir avec des zéros ASCII ou quelque chose comme ça. Lequel me suggérez-vous de faire et avec un peu de pression peut-être que je suis fini.

Merci

+0

Sans en savoir plus sur l'arrière-plan de votre problème, c'est difficile à dire. Si les mots ont moins de 16 caractères alors le remplissage (disons avec NULs) serait raisonnable, mais que faire si le mot est trop long? Juste le tronquer? Je doute que toute application de chiffrement du monde réel ferait quelque chose de si simple ... – dajames

Questions connexes