1

基本的に、(Vigenere) 復号化は完全に機能しますが、復号化の最終文字が含まれていません。たとえば、m_text の復号化では、49 文字ではなく 48 文字が生成されます。ループを操作しようとしましたが、.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;
}
4

1 に答える 1

0

一見すると、一度に 2 つの文字をデコードしています。したがって、文字列に 49 文字ある場合、1 つが残ります (これは処理されません)。m_text を 48 文字の長さにすると、正しい結果が得られることがわかります。

メッセージの長さに一致するようにキーを複製してから、文字ごとにデコードする方が簡単な場合があります。

于 2015-03-29T03:04:17.680 に答える