2015-01-06 6 views
1

사용자로부터 입력을 수집 한 다음 &을 암호화하여 해당 문자를 해독하는 프로그램을 만들어야합니다.함수 사이의 변수 공유 - rand() srand

코드 작성에 자신이 없기 때문에 코드의 많은 부분이 잘못 작성되어 모범 사례를 따르지 않을 것이라고 생각합니다. 따라서 프로그램이 단순히 값을 더하기/빼기하는 알고리즘의 간단한 버전을 작성했습니다 2에서/ASCII 값을하지만 rand() 및 srand 함수 사용을 발견했지만 내 암호화 및 암호 해독 함수 내에서 단일 값 (정적 변수?) 내에서 사용하는 방법을 잘 모르겠습니다.

여기 내 코드가 현재 전체적으로 나와 있습니다.

#include <iostream > 
#include <iomanip> 
#include <cstdlib> 
#include <ctime> 
#include <string> 
#include <cstring> 
#include <fstream> 
using namespace std; 

char getMenuSelection (char m); 
void encrypt (char key[]); 
void decrypt (char code[]); 

int main() 
{ 
    ifstream input; 
    ifstream in; 
    ofstream out; 
    char menu; 
    char message[80]; 
    //char codekey; 
    //char myname[128]; 
    menu = 0; 

    menu=getMenuSelection(menu); 
    if (menu == 'e' || menu == 'E') //Option to Encrypt 
    { 
     cout << "Enter Message to be encrypted \n"; 
     cin >> message; 
     input.open (message); 
     encrypt (message); 
     input.close(); 
     cout << "The Ciphertext is: " << message << endl; 
     return main(); 
    } 
    if (menu == 'd' || menu == 'D') 
    { 
     cout << "Enter Ciphertext to decrypt \n"; 
     cin >> message; 
     input.open (message); 
     decrypt (message); 
     input.close(); 
     cout << "The Decrypted message is: " << message << endl; 
     return main(); 
    } 
    if (menu == 'q' || menu == 'Q') 
    { 
     cout << "Program exiting."; 
     cin.ignore(); 
     return 0; 
    } 

    cin.ignore(); 
    return 0; 
    } 

char getMenuSelection (char m) // Get the menu function 
{ 
    cout << "|||_______Welcome To Elliotts Encryption_______|||\n"; 
    cout << "|||__________and Deciphering Program___________|||\n"; 
    cout << "|||____________________________________________|||\n"; 
    cout << "|||______Please select 'E' to encrypt a________|||\n"; 
    cout << "|||____message, 'D' to decipher a message______|||\n"; 
    cout << "|||______________Or 'Q' to Quit________________|||\n"; 
    cin >> m; 

switch (m) 
    { 
     case 'e': 
     case 'E': cout << "Encryption." << endl; 
        break; 
     case 'd': 
     case 'D': cout << "Decryption." << endl; 
        break; 
      case 'q': 
     case 'Q': cout << "Quitting" << endl; 
       break; 
     default: cout << "Error, Please try another message. "; 
       return getMenuSelection(m); 
    } 
    return (m); 
} 
int random (int r) 
{ 
    srand(time(0)); 
    r=rand(); 
    return r; 
    } 
void encrypt (char key[], int r) //encryption function. 
{ 
    for(int i = 0; i <= 40; i++) key[i] += r; 
} 
void decrypt (char code[], int r) //decryption function. 
{ 
    for(int i = 0; i <= 40; i++) code[i] -= r; 
} 

이 코드는 현재 인해 암호화 '에 대한 정의되지 않은 참조'(숯불 *) '내가 난수를 생성하고이를 통합하는 방법을 요구하고

질문에 실행되지 않습니다 내 암호화 및 암호 해독 기능에.

  1. 정적 또는 전역 변수를 사용하면이 작업을 그대로 적용 할 수 있습니까?
  2. 두 기능에 대해 별도의 클래스 파일을 만들어야합니까?
  3. 다른 가능한 방법은 있습니까?

나는 정확한 코드가 주어지지 않을 것이라는 것을 이해하지만, 누군가 올바른 방법으로 나를 가리키거나 내가 잘못 가고 있다고 말할 수 있다면 크게 도움이 될 것입니다.

감사합니다.

+0

암호화에 임의의 숫자를 사용하려면 (1) 사용자와받는 사람 모두 알고리즘이 동일해야합니다 ("로컬 컴파일러의 rand()"가 아님). 그리고 (2) 둘 다 RNG는 시계처럼 무작위가 아닌 동일한 키 값으로 시드합니다. 이러한 작업을 모두 수행하는 경우 메시지의 각 문자를 RNG의 숫자로 추가하거나 xor와 같이 간단한 작업을 수행 할 수 있습니다. 본질적으로 일회용 패드를 복제합니다. 그렇다면 핵심 교환에 대해 걱정할 필요가 있습니다. –

답변

1
  1. 정적 또는 전역 변수를 사용하면이 작업이 그대로 이루어 집니까?

정확하지는 않습니다.

void encrypt (char key[]); 

당신이 정의하는 함수의 서명과 일치하지 않습니다 :

void encrypt (char key[], int r); 

이는 별도의 기능을한다 (때문에 여기에 문제는 함수 서명이 선언하고 호출 단순히이다 함수 오버로딩).

글로벌 변수를 부분으로 만들 수도 있지만이 함수의 서명을 일관성있게 만들어야합니다.

당신이 그 값을 생성하는 방법은 당신에게 달려 있습니다. 아마도 사용자가 설정하거나 메시지의 일부로 설정해야합니다. 임의 번호를 사용하면 동일한 번호를 무작위로 생성하지 않으면 메시지 암호를 해독 할 수 없게됩니다.

  1. 두 기능에 대해 별도의 클래스 파일을 만들어야합니까?

아니요. 여기에 클래스 (또는 여러 파일)가 필요하지 않습니다.