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

时间:2019-05-12 20:15:18

标签: c++ encryption codeblocks message

以下是我的作业的链接:pict

用户输入和加密都很容易,但是我似乎无法解密加密。工作是输入一个字母,然后再输入十个字母(即加密),然后返回十个字母(即解密)。

我尝试弄乱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”。

3 个答案:

答案 0 :(得分:1)

您的“解密”循环永远不会执行:

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;
}

答案 1 :(得分:0)

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

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

因为最后10个字符将全部转换为“ a”。

我认为加密/解密单个字符的一种更优雅的方法如下:

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”开始计数。

答案 2 :(得分:0)

正如我在发言中所说

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 支持的任何代码。

一种简单的编码和解码方式是对给定 Y ((X^Y)^Y) == X)的任意 X 进行给定值的异或运算,因此方法相同进行编码和解码,在两种情况下都只需执行^Y

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

另一种方法是对交换一些位进行编码(例如,将较低的4位与较高的4位假定 char 至少为8位)进行编码,并进行相同的解码。 / p>

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

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

有无数种编码/解码方式