0

我可以使用此密钥加密和解密消息: string key = "zyxwvutsrqponmlkjihgfedcba"; 没有任何问题,但我想使用更复杂的密钥。这是我现在使用的密钥: 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 排列是,但你的第二个不是)。

为了解码使用非自反排列编码的内容,您需要找到反向排列:

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 回答