尝试使用密钥解密文件

时间:2013-09-29 18:48:59

标签: c++ encryption

我可以使用此密钥加密和解密消息: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')。关于我可以尝试的任何建议?

1 个答案:

答案 0 :(得分:2)

看起来你正在使用一个简单的替换密码,你的'key'是a-z的排列?如果是这种情况,我猜你的问题是你试图对编码和解码使用相同的排列(你上面的代码),这只适用于你的排列是自反的(你的第一个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)

测试密钥是否具有自反性(编码和解码的密钥相同)