为什么我的代码不返回原始消息?

Why isn't my code returning the original message?

这是我的作业 link:

用户输入和加密很容易,但我似乎无法解密加密。工作是输入一个字母,往前走十个字母(加密),再往回走十个字母(解密。

我试过弄乱 for 循环,但我没有真正工作。

#include <iostream>

using namespace std;

int main()
{
    char m; //Declare character
    cin >> m; // Input Character
    int ma = (int)m; // Convert character to integer
    int c; // Declare ciphertext
    for (int i=0; i<=10; i++) {
        c = ma + i;
        if (c > 122) {
            c = 97;
        }
    }

    char cc = char(c);
    cout << " " << endl;
    cout << "You ciphertext is:" << endl;
    cout << cc << endl;
    int cb = (int)cc;
    //cb = cb - 10;
    int nm;
    for (int b = 0; b>=10; b++) {
        nm = cb - b;
        if (nm < 97) {
            nm = 122;
        }
    }
    char mb = (char)nm;
    cout << "You message is" << endl;
    cout << mb << endl;
}

所以这就是我所期望的:当我输入 "a" 时,密文应该是 "k" 并且解密的消息应该是 "a".

您的 "decryption" 循环永远不会执行:

for (int b = 0; b>=10; b++) {

这个for循环说:从b = 0开始,然后循环,只要它大于10。嗯,0不大于10,所以不循环。

要撤消第一个循环,您可能需要这样做:

for (int b = 0; b<=10; b++) {

顺便说一下,循环只是重复相同的操作 10 次,所以你可以放弃循环:

int OFFSET = 10;
int LOWER_LIMIT = (int)'a';
int UPPER_LIMIT = (int)'z';
int RANGE_LENGTH = UPPER_LIMIT - LOWER_LIMIT + 1;

// encrypt
c = ma + OFFSET;
if (c > UPPER_LIMIT) {
    c -= RANGE_LENGTH;
}

// decrypt
nm = cb - OFFSET;
if (nm < LOWER_LIMIT) {
    nm += RANGE_LENGTH;
}

这是另一种解决方案。当您检查字符的 ascii 是否大于 122 时,您还必须进行一些数学运算。你不能只说

if (c > 122) {
   c = 97;
}

因为所有最后 10 个字符都将转换为 "a"。

我认为 encrypt/decrypt 单个字符的更优雅的方式如下:

int main() {
    char c; //Declare character
    cin >> c; // Input Character

    int ciphertext = c + 10;
    if (ciphertext > 122)
        ciphertext = ciphertext - 123 + 97;
    cout << "You ciphertext is:" << (char)ciphertext << endl;

    int deciphertext = ciphertext - 10;
    if (deciphertext < 97)
        deciphertext = 123 - (97 - deciphertext);
    cout << "You original is:" << (char)deciphertext << endl;

}

注意,如果char的ascii值超过上限则从字母"a"开始计数。

正如我在评论中所说

for (int i=0; i<=10; i++) {
    c = ma + i;
    if (c > 122) {
        c = 97;
    }
}

{
   int i = 10;

    c = ma + i;
    if (c > 122) {
        c = 97;
    }
}

因为 c 被重新分配所以前一回合对当前没有影响,只有最后一回合才算。

还有

for (int b = 0; b>=10; b++) {
    nm = cb - b;
    if (nm < 97) {
        nm = 122;
    }
}

什么都不做,因为测试 b>=10 立即为假 b 赋值为 0

独立于这些错误,所使用的编码对于很多值都是不可恢复的,并且对要编码的字符没有限制,它可以具有 char[=46= 支持的任何代码].

编码和解码的一种简单方法是对给定值进行异或运算,对于给定的 Y X ((X^Y)^Y) == X),所以编码和解码的方式相同,只是在两种情况下都做 ^Y

另一种可逆的方式是在一个方向上滚动进行编码,然后在相反方向上进行解码。警告滚动,而不是转向不松散位。

另一种方法是编码交换一些位(例如,低 4 位和高 4 位,假设 char 至少为 8 位),然后执行同样解码。

当然,您可以混合使用这些方式,而不是只使用其中一种方式。

当然你可以使用不基于公式的方法,例如为每个字母决定另一个字母来替换它(a -> Z,b -> 0 等,反之解码)

有无数种方法可以encode/decode