2017-04-16 2 views
-2

Je suis débutant en C++ et je travaillais sur un programme de chiffrement XOR. Mon programme fonctionne correctement lorsque je saisis manuellement le code dans mon programme. Le problème se produit lorsque j'essaie de décrypter une phrase cryptée et le programme renvoie uniquement le premier mot de la phrase.Problèmes C++ avec l'entrée/la sortie de chaînes XOR'ed

Exemple: chaîne entrées dans encrypter: Bonjour tout le monde

clé: q

chaîne Encrypted: V

chaîne entrées dans decrypt: V

clé: q

Sortie: bonjour

Cela me donne seulement le premier mot et je pense que cela a quelque chose à voir avec la façon dont je prends l'entrée et la sortie.

Merci beaucoup!

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string> 
#include <fstream> 

using namespace std; 
/*Encrypt/decrypt program that takes in a string and encrypts it using a single byte xor encryption. Program can also decrypt a given string with or without a key.*/ 

string XOR(string input, char key){ 
    string XORString = input; 
    string newXOR = ""; 
    for(int i = 0; i < input.length();i++){ 
     newXOR += XORString[i]^(int(key+i))%255; 
    } 
    return newXOR; 
} 

int main() 
{ 
    /*char key = 'q'; 
    std::cout << XOR("hello world",key); 
    return 0; 
    The lines above are for manual testing if needed*/ 
    bool b = true; 
    while(b){ 
     int x; 
     cout<<"Enter 1 for Encryption, 2 for Decryption, 3 for Decryption without key or 4 to end program."<<endl; 
     cin>>x; 
     if(x==1){ 
      string phrase1 = ""; 
      cout<< "Enter a phrase to encrypt: "; 
      cin.ignore(); 
      getline(std::cin,phrase1); 
      cout<<"Enter a key to encrypt with: "; 
      char key1; 
      cin>> key1; 
      std::cout << XOR(phrase1,key1)<< endl; 
     } 
     else if(x==2){ 
      string phrase = ""; 
      cout<< "Enter a phrase to decrypt: "; 
      cin.ignore(); 
      std::getline(std::cin,phrase); 
      cout<<"Enter a key to decrypt with: "; 
      char key2; 
      cin>>key2; 
      std::cout << XOR(phrase,key2)<<endl; 
     } 
     else if(x==3){ 
      char keys [] = {'!','"','#','$','%','&','(',')','*','+',',','-','.','/','0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?','@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','[',']','^','_','`','a','b','c','d','e','f','g','h','I','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','{','|','}','~'}; 
      int end = 92; 
      int count = 0; 
      string s; 
      cout<< "Enter phrase: "; 
      cin>>s; 
      for(int i = 0; i < 92;i++){ 
       count++; 
       cout<<count<<" possible combination out of " << end << " using " << keys[i]<< ":"<<XOR(s,keys[i])<<endl; 
      } 
     } 
     else if(x==4){ 
      cout<<"Have a nice day!"; 
      b = false; 
     } 
     else{ 
      cout<<"You entered an invalid number"; 
      break; 
     } 
    } 
    return 0; 

Cela pourrait être le code de problème:

  string phrase1 = ""; 
      cout<< "Enter a phrase to encrypt: "; 
      cin.ignore(); 
      getline(std::cin,phrase1); 
+0

Est-ce que '^' a hi meilleure préséance que '%'? Sauve toi et tes lecteurs beaucoup de douleur en ajoutant les parenthèses. –

+0

Ceci est probablement un problème avec XOR avec un caractère. Si le caractère est égal, vous génèrerez un caractère nul (un caractère de contrôle) qui signifie la fin de la chaîne en C/C++. XOR est pour binaire; vous devriez soit gérer ou encoder l'agare binaire résultant * ou * vous devriez utiliser un autre schéma de chiffrement tel que l'addition modulaire –

Répondre

0

Je pense que le problème est avec votre fonction XORString chaîne essayez ceci:

//change this 
newXOR += XORString[i]^(int(key+i))%255; 
//to 
newXOR = XORString[i]; 

J'espère que cela résout le problème que je n » J'en sais beaucoup sur l'opérateur OU exclusif mais je pense que cela cause le problème dans la fonction de chaîne

+0

Si cela ne fonctionne pas, dites-le moi pour que je puisse essayer de trouver une autre façon de le résoudre. – Tyger