【问题标题】:trying to decrypt a file using a key尝试使用密钥解密文件
【发布时间】:2013-09-29 18:48:59
【问题描述】:

我能够使用此密钥加密和解密消息: 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')。有什么我可以尝试的建议吗?

【问题讨论】:

  • 您能否解释一下您得到的结果与您的预期?
  • 与其使用幻数(如97122),不如使用这些ASCII 代码所代表的实际字母(即'a' 和@987654326)更容易阅读和理解您所做的事情@)。
  • 什么是加密功能?恐怕你在这两个函数中都使用了output[i]=key[input[i]-'a'],这对任意键都不起作用。其中一项功能必须在键中执行查找。
  • 评论不应该说明你在做什么(代码就是这样做的)他们应该解释你为什么这样做。
  • 你注意到加密和解密方法是一样的吗?你如何期望他们做相反的事情?

标签: c++ encryption


【解决方案1】:

看起来您使用的是简单的替换密码,您的“密钥”是 a-z 的排列?如果是这种情况,我猜你的问题是你试图对编码和解码使用相同的排列(你上面的代码),这只有在你的排列是自反的情况下才有效(你的第一个 z-a 排列是,但你的第二个不是)。

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

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) 测试一个键是否是自反的(编码和解码的键相同)

【讨论】:

  • 我不知道会做这样的事情。 string rv(26, '\0') 说明了什么?我知道 rv 是一个字符串,我只是想知道参数是什么意思。
  • @KevinSimpsonII:这会将字符串 rv 初始化为 26 个字符的大小,所有这些字符都是 NUL ('\0') 字符。
  • 我刚刚把所有的东西都画出来了,现在我明白了发生了什么。它本质上创建了一个反向密钥,用作我的解密函数中的参考。太棒了。
  • @KevinSimpsonII - 不,这很简单。试试看。
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2017-08-18
  • 2015-04-15
相关资源
最近更新 更多