【问题标题】:Sharing variable between functions - rand() srand在函数之间共享变量 - rand() srand
【发布时间】:2015-01-06 00:02:34
【问题描述】:

我必须创建一个程序来收集用户的输入,然后加密和解密这些字符。

我对编码不是很有信心,所以我确信我的代码的许多部分都写得不好并且没有遵循最佳实践,所以我编写了一个简单版本的算法,程序只是简单地添加/减去一个值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;
 }

由于'未定义对'encrypt(char*)'的引用,此代码当前不执行

问题

我在问如何生成随机数并将其合并到我的加密和解密函数中。

  1. 是否会使用静态或全局变量使其按原样工作?
  2. 是否需要为这两个函数创建单独的类文件?
  3. 还有其他可能吗?

我知道我不会得到完整的正确代码,但如果有人能指出我正确的方式或告诉我哪里出错了,那将对我有很大帮助。

谢谢。

【问题讨论】:

  • 要使用随机数进行加密,您需要确保 (1) 您和您的接收者具有完全相同的算法(不仅仅是“无论本地编译器的 rand( ) 确实"),并且 (2) 你们俩都使用相同的键值播种 RNG,而不是随机的,例如时钟。如果你做这两件事,那么你可以做一些简单的事情,比如用来自 RNG 的数字添加或异或消息的每个字符,基本上复制一次性填充。然后你需要担心密钥交换......

标签: c++ variables encryption random srand


【解决方案1】:
  1. 是否会使用静态或全局变量使其按原样工作?

不准确。这里的问题只是你声明和调用的函数签名:

void encrypt (char key[]);

与您定义的函数的签名不匹配:

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

这使它成为一个单独的函数(由于函数重载)。

r 设为全局变量可能是解决方案的一部分,但您仍需要使此函数的签名保持一致。

至于您如何产生该价值,这取决于您。不过,大概它需要由用户设置或成为消息的一部分;除非您随机生成相同的数字,否则使用随机数字将无法解密消息。

  1. 是否需要为这两个函数创建单独的类文件?

没有。这里不需要任何类(或多个文件)。

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2016-03-25
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多