Comment réutiliser une clé dans vigenere cipherkey cs50 pset2

Je faisais un programme pour le chiffrement de Vigenere. J’ai fait le programme imprimer le texte chiffré avec succès. Mais je ne peux pas boucler la clé. donc si ma clé était ‘abc’ et mon texte brut était bonjour, il devrait afficher ‘hfnlp’ et non ‘hfn’.

#include  #include  #include  #include  int main(int argc, ssortingng argv[]) { if(argc != 2) { printf("\aError\n"); return 1; } else { ssortingng a = argv[1]; // converts argv[1] printf("plaintext: "); ssortingng b = get_ssortingng(); // takes the plaintext printf("ciphertext: "); for(int c = 0, d = strlen(a); c < d; c++) { for(int e = 0, f = strlen(b); e < f; e++) { if(islower(a[c])) { printf("%c\n", b[e] + ( (a[c] - 97) % 26) ); // works for lowercase letters return 0; } else if(isupper(a[i])) { printf("%c\n", b[e] + ( (a[c] - 65) % 26) ); // works for uppercase letter } else { printf("%c", b[e]); // works for non alphabetical inputs } if(true) break; } } printf("\n"); } } 

    Votre choix de noms de variable d’une seule lettre est impair. cela rend plus difficile de travailler avec votre code. Je ne suis pas fan des noms longs non plus, mais des noms de variables de longueur intermédiaire (2 à 8 caractères – à l’exception de certains noms stylisés à une seule lettre ( c , i , j , k , p , s ) – sont généralement appropriés).

    Vous avez des problèmes, car si votre clé comporte 6 caractères et votre chaîne, 24 caractères alphabétiques, vous essayez de générer 144 caractères alphabétiques en raison de la structure de la boucle. Vous n’avez besoin que d’une seule boucle qui parcourt les caractères du texte brut. Vous avez une variable distincte qui parcourt la longueur de la clé et revient au début lorsqu’elle est épuisée. Dans ce code, la longueur de la clé est en keylen (vous avez utilisé d ) et le décalage (index) dans la clé est en keyoff (vous avez utilisé c ) – mais la clé est toujours dans a car c’est ce que vous avez utilisé. Laissé à moi-même, j’utiliserais probablement le text (ou peut-être plain ) à la place de b , textlen à la place de f , et j’utiliserais i au lieu de e pour la variable de boucle. Si je voulais utiliser des index courts, je pourrais utiliser k au lieu de keyoff . Je pourrais aussi éditer la chaîne in situ et imprimer la chaîne entière à la fin.

    Ce code garantit également que les caractères alpha de la clé sont en minuscules. Cela ne garantit pas que la clé est entièrement alpha; cela devrait sans doute être une tâche banale, puisque la clé est quand même scannée. Dans l’état actuel des choses, c’est un cas de GIGO – des ordures à la poubelle.

    Le code convertit la lettre saisie ( az ou AZ ) en un «décalage dans l’alphabet» en soustrayant a ou A , convertit la lettre clé en un décalage dans l’alphabet, ajoute les deux décalages modulo 26 (nombre de lettres dans l’alphabet). et reconvertit le décalage en une lettre du cas approprié.

     #include  #include  #include  #include  int main(int argc, ssortingng argv[]) { if (argc != 2 || strlen(argv[1]) == 0) { fprintf(stderr, "Usage: %s key < text\n", argv[0]); return 1; } string a = argv[1]; int keylen = strlen(a); for (int i = 0; i < keylen; i++) a[i] = tolower((unsigned char)a[i]); printf("key: %s\n", a); printf("plaintext: "); string b = get_string(); printf("ciphertext: "); int keyoff = 0; // Step through each character of the plain text. Encrypt each // alpha character with the (lower-case) key letter at a[keyoff], // incrementing keyoff. Don't increment key offset when processing // non-alpha data. for (int e = 0, f = strlen(b); e < f; e++) { if (islower(b[e])) printf("%c", ((b[e] - 'a') + (a[keyoff++] - 'a')) % 26 + 'a'); else if (isupper(b[e])) printf("%c", ((b[e] - 'A') + (a[keyoff++] - 'a')) % 26 + 'A'); else printf("%c", b[e]); if (keyoff >= keylen) keyoff = 0; } printf("\n"); return 0; } 

    Lorsqu’il est compilé dans le programme vc41 et exécuté, il génère, par exemple:

     $ vc41 abcdef key: abcdef plaintext: The quick brown Fox jumped over the lazy Dog. ciphertext: Tig tyncl dusbn Gqa nzmqgg saes vki qaaa Gsl. $ 

    J’ai généré une clé aléatoire de 8 lettres (c’était GZlfmTMk ) et GZlfmTMk exécuté le code sur un certain nombre de chaînes “alphabet complet”:

     $ vc41 GZlfmTMk key: gzlfmtmk plaintext: Pack my box with five dozen liquor jugs. ciphertext: Vznp yr nyd vtyt yufk czeqg xswtzw vnsc. $ vc41 GZlfmTMk key: gzlfmtmk plaintext: The five boxing wizards jump quickly. ciphertext: Zgp kuoq luwtss pujgqox vnyz wtthwek. $ vc41 GZlfmTMk key: gzlfmtmk plaintext: How vexingly quick daft zearm jump. ciphertext: Nnh aqquxmkj vgbou jzqy lxnbgr uzyi. $ vc41 GZlfmTMk key: gzlfmtmk plaintext: Bright vixens jump; dozy fowl quack. ciphertext: Hqtltm hsddyx vnyz; jnkd rhiv wtlhw. $ vc41 GZlfmTMk key: gzlfmtmk plaintext: The quick brown fox jumps over the lazy dog. ciphertext: Zgp vgbou hqzbz yah ptxue hhox ssj xtli jnr. $ 

    (Je note en passant que sur un Mac exécutant macOS Sierra 10.12.6 utilisant GCC 7.1.0, ce code est lié sans inclure la (nouvelle) bibliothèque CS50 – il existe une fonction système get_ssortingng() qui possède une interface différente de la Une version CS50 qui satisfait à la référence mais bloque le programme, mais man get_ssortingng , donc je ne suis pas sûr de ce que la fonction système de ce nom a réellement; je ne l’ai pas poursuivie plus activement, ni découverte. quelle étendue le problème est. Cela m’a causé une migraine que l’ancienne bibliothèque CS50 n’a pas. Grumble…)

    réparer comme ça

     #include  #include  #include  int main(int argc, ssortingng argv[]){ if(argc != 2 || !*argv[1]){ printf("\aError:The number of command arguments is incorrect.\n"); printf("Usage: %s key_ssortingng\n", argv[0]); return 1; } //Since it is `return 1;` in the if-statement, //the else clause is unnecessary (unnecessarily deepening the nest) ssortingng key = argv[1];//It does not convert. size_t i, key_len; unsigned char curr_char; for(i = 0; (curr_char = key[i]) != '\0'; ++i){ if(!isalpha(curr_char)){ printf("\aError:Only the alphabet can be specified as the key.\n"); return 1; } key[i] -= islower(curr_char) ? 'a' : 'A';//Convert to Deviation } key_len = i; i = 0; printf("plaintext : "); ssortingng plain = get_ssortingng(); printf("ciphertext: "); for(size_t j = 0; (curr_char = plain[j]) != '\0'; ++j){//Scan of plain text should be the main loop. if(isalpha(curr_char)){ char base_char = islower(curr_char) ? 'a' : 'A';//Avoid using magic numbers putchar(base_char + (curr_char - base_char + key[i]) % 26);//Make the same process one if(++i == key_len) i = 0;//reset key index } else { putchar(curr_char);//non alphabetical inputs } } printf("\n"); free(plain); }