基本上,(Vigenere)解密工作完美,除了不包括解密的最终字母。例如,m_text的解密产生48个字母而不是49个。我甚至试图操纵循环,但它没有很好地工作,因为我将使用.at()获得超出范围的异常。任何帮助,将不胜感激!
using namespace std;
#include <string>
#include <iostream>
int main()
{
string ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string m_text = "ZOWDLTRTNENMGONMPAPXVUXADRIXUBJMWEWYDSYXUSYKRNLXU";
int length = m_text.length();
string key = "DA";
string plainText = "";
int shift = 0;
int shift2 = 0;
//Loop that decrypts
for (int k = 0; k < length-1; k+=2)
{
//Key 1 shift
shift = m_text.at(k) - key.at(0);
//Key 2 shift
shift2 = m_text.at(k+1) - key.at(1);
if (shift >= 0)
{
plainText += ALPHABET.at(shift);
}
else
{
shift += 91;
plainText += (char)shift;
}
if (shift2 >= 0)
{
plainText += ALPHABET.at(shift2);
}
else
{
shift2 += 91;
plainText += (char)shift2;
}
}
cout << plainText << endl;
}
答案 0 :(得分:0)
从外观上看,您一次解码两个字符。因此,当您的字符串中有49个字符时,剩下一个字符(未处理)。如果你使m_text长48个字符,你会发现你得到了正确的结果。
复制密钥以匹配邮件的长度可能更容易,然后逐个字符解码。