decrypt/encrypt C 中的异或算法

decrypt/encrypt xor algorithm in C

在这里,我正在尝试使用 XOR 加密消息。但是,当我 运行 程序时,我得到了奇怪的输出(随机输出)。我想我在这里遗漏了一些东西。

我的代码示例:

/*
* Description: Decipher the message using XOR and print it.
* Parameters:
*   cipher: The cipher of the message (With the key embedded at the start)
*   keyLength: The length of the key at the start of the message
*Return:
*   None.
*Note:
    Do not use any additional variables for this challenge.
*/

void print_cipher_message(unsigned char cipher[], int keyLength) {
    // TODO: complete the function
    //keyLength = 3;
    for (int i = 0; i < strlen(cipher) && i <= keyLength; i++) {
        
            i % keyLength;
    
        cipher[i] = cipher[i] ^ keyLength;
      // i% keyLength;// i % ;//cipher[i] % sizeof(keyLength);
        
        printf("%c", cipher);
    }

}


int main() {
    
    unsigned char cipher[] = "\x12\x56\xd4\x61\x26\xbb\x7b\x3a\xbd\x7c\x31\xf4\x61\x3e\xbb\x65\x25\xf4\x7b\x25\xf4\x73\x76\x97\x40\x1f\x99\x57";
    int keyLength = 3;


    //print the cipher message
    print_cipher_message(cipher, keyLength);
    
    return 0;
}

预期结果如下:

/*
    EXAMPLE:
    cipher="\x31\xf4\x61\x7a\x33\xb8\x7e\x39\xf4\x65\x39\xa6\x7e\x32\xf5\x33"
    keyLength=3;

    then the cipher is:
    "\x31\xf4\x61\x7a\x33\xb8\x7e\x39\xf4\x65\x39\xa6\x7e\x32\xf5\x33"
    ^----Key-----^^-------------------Message------------------------^

    */

非常感谢您的帮助。谢谢。

我马上发现了几个问题:

  1. 您要求 printf 打印 char (%c) 但传递的是指向 char 的指针而不是 char.

  2. 有一行i % keyLength什么都不做,它只是执行计算并丢弃结果。

此外,您每次都在循环中调用 strlen,这会有点昂贵。

我想你在这里要做的是有两个索引,一个在 0 到 keyLength 范围内循环,另一个在字符串上迭代以进行编码(从索引 [=17 开始) =]).当第二个索引到达字符串末尾时函数结束。

首先,你需要正确理解问题。您的问题表明密钥嵌入在密码的开头,其长度为 keyLength。所以你需要把这部分分开然后和剩下的密码异或。

代码应该类似于:

void print_cipher_message(unsigned char cipher[], int keyLength) {
    for (int i = 0; i < strlen((char*)cipher) - keyLength; i++) {
        cipher[i + keyLength] = cipher[i + keyLength] ^ cipher[i % keyLength];
    }

    printf("%s", cipher + keyLength);
}

我在没有调试的情况下迅速写下了它,所以它可能有错误。另外,问题本身不正确。它需要密码长度,我们不能真正使用 strlen()