在 C 中的解密中使用字符串密钥

Using string key in decryption in C

我已经删除了重复的问题,这是最终修订版。我有一个关于如何在 C 中使用字符串密钥解密解密字符串的问题。我使用 int 密钥加密和解密的基本信息,但不知道如何处理字符串密钥。

我需要使用这些仅给定的数据来编写下面函数的定义,并且注释作为帮助编写函数的提示。

其中一个按位运算符已用于一次对字符串加密一个字符使用加密密钥中的所有字符,从左到右。给定加密密钥和 ent[] 加密文本,解密函数检索原始文本并将其放入 det[].

void decrypt(const char key[], const char ent[], char det[]);//fun prototype
char key[] = "Advanced C";
char ent[100] = ""├8023.)/<)423}2;}↑%>1(.4+8}↕☼};2/}├<)<}↑3>/$-)423}<39}├8>/$-)423s";

ent[] string image

char det[100];

处理字符串键应遵循哪种算法。在这种情况下,我需要从左到右使用 key[] 中的所有字符,但不知道该使用什么算法。

我的第一次试用没有成功

void decrypt(const char key[], const char ent[], char det[])
{
          
int i = 0;

    while (ent[i] != '[=12=]')
    {
        int j = 0;
        while (key[j] != '[=12=]')
        {
            det[i] = ent[i] ^ key[j];
            j++;
            i++;
            if(!(*ent))
            break;
        }
        
    }
   
}

(我的回答考虑到了 How do I ask and answer homework questions?。从对 OP 解释的想法的一些反馈开始。)

"我应该累加key中每个字符的ASCII码吗"
是的,Eric Postpischl 对此进行了尝试,结果输出有点奇怪但实际上可读。

(这是我的想法,相信埃里克,我现在认为不太可能:
可能不会。我建议分开使用每个字符。

  • 在第一个加密文本字符上使用第一个密钥字符,结果进入第一个解密文本字符
  • 然后第二个密文字符上的第二个关键字符,变成第二个解密文字符

)

“然后异或”
不必要。您的作业说明“其中一个按位运算符”,因此它不一定是 XOR。但是,是的,XOR 对于可逆加密最有意义,所以一定要先尝试一下。

"或使用 >> 或 << 或究竟是什么"
我不认为这些运算符属于“按位”运算符。所以不,不太可能。

“在获取键结束时重新开始[]”
是的,这似乎是唯一可能的方法。

“但没用”
如果您能详细说明问题出在哪里,将会有所帮助。
但我希望不积累密钥能解决你的问题。
请显示您得到的结果和您尝试过的 MRE (https://whosebug.com/help/minimal-reproducible-example)。

看到你的功能了,看看

det[i] = ent[i] ^ key[j];

在内层循环中,随着j和常量i的变化,它会重复写入det中的同一个地方。但是只有最后一个有效果,只有最后一个关键字符有效。
你打算积累但没有。
考虑在内部循环之外使用该行(或一些非常相似的东西),j 为 0,然后在循环内做一些不同的事情,这让所有关键字符都有影响。
(看Erics评论,更详细。)

看到修改后的功能,有点怀疑

            j++;
            i++;

在内循环中递增 i 似乎有问题。它很容易通过 ent 的终止符和 det.
的大小 请使用调试器观察您的程序运行情况。

看着你的代码的另一个更新,我想知道你试图在那里编程什么。我知道你想要做的是“将键的所有字符累积到一个键上,将该键应用于所有输入字符”。有一种方法可以在嵌套循环中执行此操作,但我建议在一个 non-nested 循环中进行累积,然后在第二个 non-nested 循环中将累积的键应用于每个输入字符。我建议放弃你当前版本的内循环,确实放弃内循环的整个概念再试一次。阅读 Erics 的评论似乎已经足够详细了。

如果 XOR 是算法,那么加密和解密可以简化为:

#include <stdio.h>
#include <string.h>

void decrypt (const char key[], const char cipher[], char text[]) {
    char XOR = 0;
    while (*key) XOR ^= *key++;

    strcpy (text, cipher); // buffer overflow chance

    while (*text) *text++ ^= XOR;
}

void encrypt (const char key[], const char text[], char cipher[]) {
    char XOR = 0;
    while (*key) XOR ^= *key++;

    strcpy (cipher, text); // buffer overflow chance

    while (*cipher) *cipher++ ^= XOR;
}


int main () {
    char key[] = "Advanced C";
    char ent[100] = "";//├8023.)/<)423}2;}↑%>1(.4+8}↕☼};2/}├<)<}↑3>/$-)423}<39}├8>/$-)423s";
    char det[100] = "Demonstration of Exclusive OR for Data Encryption and Decryption.";

    encrypt(key, det, ent);
    printf ("Encrypted Text: [%s]\n", ent);
    det[0] = '[=10=]';
    decrypt(key, ent, det);
    printf ("Decrypted Text: [%s]\n", det);

    return 0;
}