解密过程中添加了多余的字母

时间:2019-03-14 14:05:37

标签: c++ encryption cryptography introduction

我正在用C ++构建Vignere密码,由于某种原因,在第一个crypto / decrypt命令之后,引入了一个额外的符号,而我对为什么感到困惑。 这是一个例子

  

aaaa,bbbb,1

作为输出,我们得到

  

bbbb

此后,我们重复操作

  

aaaa,bbbb,1

现在,我们得到了:

  

?bbbb

解密也会发生同样的事情。考虑到最初的加密/解密工作正常,我对为什么要添加它感到很困惑

这是vignere.cpp

   #include <iostream>
#include <cstdlib>
#include<algorithm>
std::string encrypt(std::string plaintext, std::string key, int encryptordecrypt){
std::string ciphertext="";
std::string dekey="";
    if(key[0]==' '){
       key.erase(std::remove(key.begin(),key.end(),' '),key.end()); }
       unsigned int keylength=key.length(); /* Gets rid of leading spaces */
for( unsigned int i=0; i<plaintext.length();i++){
        if(islower(plaintext[i])){
            plaintext[i]=toupper(plaintext[i]);
        };
        if(islower(key[i%keylength])){
            key[i]=toupper(key[i%keylength]);
        };
    if(encryptordecrypt>0){
            if(plaintext[i]==' '){
                ciphertext+=' ';
            }
            else{
                    div_t ptxtdiv= div(plaintext[i]+key[i%keylength]-65*2,26);
                    int rem= ptxtdiv.rem;
                    ciphertext+= char (rem+65);
        };
    }
    else if(encryptordecrypt<0){
                   if(plaintext[i]==' '){
                        ciphertext+=' ';
                    }
                    else{
                        dekey+=26-key[i]+65*2;
                        std::cout<< dekey[i]<<std::endl;
                        div_t ptxtdiv= div(plaintext[i]+dekey[i%keylength]-65*2,26);
                        int rem= ptxtdiv.rem;
                        ciphertext+= char (rem+65);
                    };
        }


};
return ciphertext;
}

这是main.cpp

#include <iostream>
#include <cstdlib>

std::string encrypt(std::string plaintext, std::string key,int encryptordecrypt);



int main(){
std::cout << "Please input the message, then the key, separated by a comma, and then after another comma, either 1=encrypt or -1=decrypt" << std::endl;
std::string plaintext,key;
int enorde;
 while(std::getline(std::cin,plaintext, ',') && std::getline(std::cin,key,',') && std::cin>>enorde){
        std::cout << encrypt(plaintext,key,enorde) << std::endl;

}

return 0;
}

可能是因为

  

std :: string Ciphertext =“”;

不在循环中吗?

1 个答案:

答案 0 :(得分:3)

它没有被添加-输入内容超出了您的想象。

如果您立即打印所读内容:

while(std::getline(std::cin,plaintext, ',') && std::getline(std::cin,key,',') && std::cin>>enorde){
        std::cout << "Plaintext: " << plaintext << std::endl
                  << "key: " << key << std::endl
                  << "direction: " << enorde << std::endl;
        std::cout << encrypt(plaintext,key,enorde) << std::endl;
}

您将会看到

Plaintext: aaaa
key: bbbb
direction: 1
BBBB
Plaintext: 
aaaa
key: bbbb
direction: 1
?BBBB

请注意,第二个plaintext中有一个换行符。
这是因为std::cin>>enorde将换行符留在了输入缓冲区中,当您在下一次迭代中读取下一个逗号时,它将被拾取。

简单的解决方法是在循环中添加std::cin.ignore(some_big_number, '\n')

道德:当输出令人惊讶时,请验证输入是否符合您的预期。