【问题标题】:Using rand() and srand() in an encryption code在加密代码中使用 rand() 和 srand()
【发布时间】:2015-12-02 23:06:03
【问题描述】:

这个问题要我编写一个一次性小键盘密码系统,其中消息比密钥长。该程序将使用 srand() 和 rand() 生成从 0 到 4 的数字(如果键有 5 个字母)并将它们用于整个句子。 srand 使用种子,它是初始键的字母的 ASCII 值的总和。现在的问题是加密的句子和例子不一样(下附)。

#include <iostream>
#include <string>
#include <iomanip>
#include <cmath>
#include <stdlib.h>
using namespace std;
int main ()
{
    string message, key;
    int messagevalue, keyvalue, i=0, j=0, seed=0;


    cout<<"Enter the message: ";

    getline(cin, message);

    cout << "Enter the key: ";

    getline(cin, key);

    messagevalue = message.length();
    keyvalue = key.length();

    while (key[i] != 0)
    {
        i++;
        j++;
    }


    cout << "The message is: " << setw(20)  << message << endl;

    for (i=0; i < messagevalue; i++)
    {
       seed = seed + key[i];
    }

    srand(seed);

    for(i=0; i < messagevalue; i++)
    {

    message[i] = 65 + (message[i] + key[rand()%j]) % 26;

    }

    cout <<"The cipher is: " << setw(21)  << message <<endl;


    for(i=0; i < messagevalue; i++)
    {
      message[i] = 65 + 26 + (message[i] - key[rand()%j]) % 26;

      if ((message[i] - key[i]) >= 0)
      {
          message[i] = message[i] - 26;
      }

    }

    cout << "The message again is: " << setw(14)  << message << endl;



    return 0;
}

【问题讨论】:

  • 我看不出您的输入和解密的消息之间有什么区别。或者这就是它的本意,但你没有得到那个?如果是这样,您可以发布您的代码生成的内容吗?
  • 是的,这就是它应该如何的示例。我得到 UIWUMTOUVWHHJHJFQGIXWOSDCWQKIYIV 和解密更糟
  • 没有理由期望加密文本与示例相同,除非您使用与创建示例的人相同的编译器和运行时库。当然,您应该能够取回原始文本。
  • 请注意,srand()rand() 不适合进行严重加密。如果您进行非严重加密,则可以。
  • @KeithThompson 实际上是作业

标签: c++ encryption random codeblocks srand


【解决方案1】:

代码应该在加密消息之后和解密之前再次调用srand(seed),以便rand()在解密时生成与加密时相同的值序列。

还要注意,带有i++j++ 的循环只是将ij 设置为key.length()。然后代码丢弃i的新值。

另外请注意,在函数的顶部定义所有变量,直到很久以后才使用它们是不好的做法。在第一次使用时定义变量,并将它们作为定义的一部分进行初始化。所以,例如,而不是

int messagevalue;
.
.
.
messagevalue = message.length();

使用

int messagevalue = message.length();

最后,messagevalue 的一个更好的名称是 message_length,因为它实际上就是这样。

【讨论】:

  • 非常感谢您的提示!我尝试将 srand 放在解密之前,但它没有再次产生相同的消息。
【解决方案2】:
for (i=0; i < messagevalue; i++)
{
   seed = seed + key[i];
}

keymessage 短,所以key[i] 是越界访问。应该是

for (i=0; i < keyvalue; i++)
{
   seed = seed + key[i];
}

【讨论】:

  • 实际上效果很好!!多谢。但解密消息还是不一样。
猜你喜欢
  • 2014-05-01
  • 2021-01-23
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2014-10-26
相关资源
最近更新 更多