2015-12-05 1 views
1
string S, K, generated; 
cout << "Enter the message: "; 
cin >> S; 
cout << "Enter the key: "; 
cin >> K; 
cout << "The message is: " << S << endl; // output the string 
int seed = 0; 
for(int i = 0; i < (int) K.length(); i++) 
    seed += K[i]; // used to generate a certain sequence of numbers 
srand(seed); // new seed per new key 
cout << "The cipher is: "; 
for(int i = 0; i < (int) S.length(); i++) { 
    int R = rand() % K.length(); 
    char L = 65 + (S[i] - 65 + K[R] - 65) % 26; 
    cout << L; 
    generated += L; // to actually have something to use for decryption 
} 
// FINALLY, to reach to this step and do something like this took me over 2 hours of continuous debugging 
cout << endl; 
cout << "The message again is: "; 
for(int i = 0; i < (int) generated.length(); i++) { 
    int R = rand() % K.length(); 
    char L = 65 + (generated[i] - 65 + K[R] - 65) % 26; 
    cout << L; 
} 
cout << endl; 

Извините за беспорядочный код. Во всяком случае, так вот что я сделал до сих пор:Расшифровать зашифрованный текст до открытого текста с известным ключом

  • Пользователь вводит сообщение и ключ
  • Пользователь получает шифротекста

Но теперь я на самом деле застрял с тем, что я хочу, чтобы расшифровать зашифрованный текст, используя правильный ключ. В принципе, я хочу вернуть зашифрованный текст в открытый текст. Я прилагаю все усилия, чтобы сделать это сам, и этот подход указан в разделе «Сообщение снова:», но это дает мне неправильный результат.

Что я здесь делаю неправильно?

ответ

1

Этот код странный, но он действительно может работать. При условии, что кодер и декодер сделаны одним и тем же компилятором и, вероятно, на том же компьютере.

Вы используете ключ для генерации семени для srand. Это семя можно воспроизвести. Происходящие случайные числа будут предсказуемыми.

При декодировании сообщения вы должны снова srand с тем же самым семенем.

int main() 
{ 
    string S, K, generated; 
    S = "MESSAGE"; 
    K = "KEY"; 
    cout << "The message is: " << S << endl; // output the string 

    { 
     int seed = 0; 
     for (int i = 0; i < (int)K.length(); i++) 
      seed += K[i]; // used to generate a certain sequence of numbers 
     srand(seed); // new seed per new key 
    } 

    cout << "The cipher is: "; 
    for (int i = 0; i < (int)S.length(); i++) 
    { 
     int R = rand() % K.length(); 
     char L = 65 + (S[i] - 65 + K[R] - 65) % 26; 
     cout << L; 
     generated += L; // to actually have something to use for decryption 
    } 

    {//we can use the key to regenerate the same seed: 
     int seed = 0; 
     for (int i = 0; i < (int)K.length(); i++) 
      seed += K[i]; 
     srand(seed); //**** this is critical **** 
    } 

    cout << endl << "The message again is: "; 
    for (int i = 0; i < (int)generated.length(); i++) 
    { 
     int R = rand() % K.length(); 
     char L = 65 + (generated[i] - 65 + (26 - (K[R] - 65))) % 26;//reverse shift 
     cout << L; 
    } 
    cout << endl; 
    return 0; 
} 
+0

Я должен сказать, что на фазе дешифрования я больше не использовал произвольно сгенерированные числа из-за того, что я сохранил их в массиве, чтобы избежать путаницы с srand(). Метод обратного сдвига работал отлично. – Hakam

+0

Вы также можете сделать это без случайных чисел, а затем ваш код будет очень похож на «Vigenere». –

1

Не совсем уверен, так как я не смог составить компиляцию нового решения, но я предполагаю, что вы используете новое случайное число во время фазы дешифрования. Вам нужно сохранить исходное случайное число, используемое при шифровании, чтобы сделать функцию инвертируемой.

+0

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

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