这个问题要我编写一个One-Time-Small Pad密码系统,其中消息比密钥长。程序将使用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;
}
答案 0 :(得分:0)
代码应在加密消息之后和解密之前再次调用srand(seed)
,以便rand()
在解密时生成与加密时相同的值序列。
另请注意,i++
和j++
的循环只是将i
和j
设置为key.length()
。然后代码抛弃i
的新值。
另请注意,将函数顶部的所有变量定义为直到很久以后才使用它们是不好的做法。在首次使用时定义变量,并将它们初始化为定义的一部分。所以,例如,而不是
int messagevalue;
.
.
.
messagevalue = message.length();
使用
int messagevalue = message.length();
最后,messagevalue
的更好名称是message_length
,因为它实际上就是这样。
答案 1 :(得分:0)
for (i=0; i < messagevalue; i++)
{
seed = seed + key[i];
}
key
比message
短,因此key[i]
超出了界限访问权限。应该是
for (i=0; i < keyvalue; i++)
{
seed = seed + key[i];
}