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------------------------^
*/
非常感谢您的帮助。谢谢。
我马上发现了几个问题:
您要求 printf
打印 char
(%c
) 但传递的是指向 char
的指针而不是 char
.
有一行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()
。
在这里,我正在尝试使用 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------------------------^
*/
非常感谢您的帮助。谢谢。
我马上发现了几个问题:
您要求
printf
打印char
(%c
) 但传递的是指向char
的指针而不是char
.有一行
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()
。