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