0

次のキーを使用してメッセージを暗号化および復号化できます。問題はありませんでしたが、代わりにもっと複雑なキーを使用したかったのです。これは私が今使っているキーです: string key = "zwtqnkhebyvspmjgdaxurolifc";

メッセージは期待どおりに暗号化されていますが、復号化しようとすると、メッセージは通常の状態に戻りません。以下はコードです:

string Security::DecWordUsingCrypto(string word, string key)
{
  string decWord = word;

  for (int i = 0; i < word.size(); i++)
    {
      char c = tolower(word[i]);

      if ((c < 'a') || (c > 'z'))
          decWord[i] = c;
      else
        {
          decWord[i] = key[(c - 'a')]; 
        }
    }
 return decWord;
}

メッセージがさらに暗号化される理由はわかっていますが、エラーなしでメッセージを復号化する方法がわかりません。とは簡単には言えませんint j = (c + 'a')。私が試すことができることについて何か提案はありますか?

4

1 に答える 1

2

「キー」がazの順列である単純な置換暗号を使用しているようです? その場合、問題は、エンコードとデコードの両方に同じ順列 (上記のコード) を使用しようとしていることにあると思います。これは、順列が再帰的である場合にのみ機能します (最初の za 順列は、しかし、あなたの2番目はそうではありません)。

非再帰順列でエンコードされたものをデコードするには、逆順列を見つける必要があります。

string reverse_perm(string key) {
    assert(key.size() == 26);  // 26 letters in the alphabet
    string rv(26, '\0');
    for (int i = 0; i < 26; i++) {
        char c = key[i];
        assert(islower(c));        // must be a lower case letter
        assert(rv[c-'a'] == '\0'); // each letter only appears once in the key
        rv[c-'a'] = 'a'+i;
    }
    return rv;
}

でエンコードすればkey、でデコードできますreverse_perm(key)。キーが再帰的であるかどうか(エンコードとデコードの両方で同じキー)をテストできますkey == reverse_perm(key)

于 2013-09-29T19:49:25.093 に答える