С XOR дешифрование - это точно такая же операция, как и шифрование. Запустите зашифрованную строку через метод xor_encrypt
снова тот же ключ), и у вас есть обычный текст.
предупреждение 1: нулевые символы
Одна вещь, чтобы следить за: если символ в строке соответствует соответствующему символу в ключе, ваш результат будет '\0'
. Это будет интерпретироваться вашим текущим кодом как «конец строки» и прекратит расшифровку. Чтобы обойти это, вы хотите передать длину «фактической» строки в качестве параметра вашей функции.
предупреждение 2: короткие ключи
Вы также хотите, чтобы убедиться, что вы не пробежать мимо конца ключа - если обычный текст очень долго вы, возможно, придется повторить ключ. Вы можете сделать это с помощью оператора %
- просто переработайте ключ с самого начала.
Вот полный пример, который показывает эти методы:
#include <stdio.h>
#include <string.h>
void xor_encrypt(char *key, char *string, int n)
{
int i;
int keyLength = strlen(key);
for(i = 0 ; i < n ; i++)
{
string[i]=string[i]^key[i%keyLength];
}
}
int main(void) {
char plain[] = "This is plain text";
char key[] = "Abcdabcdabciabcdabcd";
int n = strlen(plain);
// encrypt:
xor_encrypt(key, plain, n);
printf("encrypted string: \n");
for(int ii = 0; ii < n; ii++) {
if(plain[ii] > 0x32 && plain[ii] < 0x7F) printf("%c", plain[ii]);
else printf(" 0x%02x ", plain[ii]);
}
printf("\n");
// **** if you include this next line, things go wrong!
n = strlen(plain);
xor_encrypt(key, plain, n);
printf("after round trip, plain string is '%s'\n", plain);
}
Это (не понимая проблему с Kay == строкой) приводит к укороченному дешифрованию (The i
в plain
соответствует тем же буквам в key
):
encrypted string:
0x15 0x0a 0x0a 0x17 A 0x0b 0x10 D 0x11 0x0e 0x02 0x00 0x0f B 0x17 0x01 0x19 0x16
after round trip, plain string is 'This is pla'
выход из линии я отмеченную выше (то есть, сохраняя значение n
в качестве исходной длины строки), ваш результат
encrypted string:
0x15 0x0a 0x0a 0x17 A 0x0b 0x10 D 0x11 0x0e 0x02 0x00 0x0f B 0x17 0x01 0x19 0x16
after round trip, plain string is 'This is plain text'
как и следовало ожидать.
Решите уравнение 'a = b^c' для' b'. –
Ваша проблема заключается в том, как работает шифрование XOR, а не часть программирования. – Ray