Скремблированный вывод при использовании OpenMP для шифра XOR - PullRequest
0 голосов
/ 09 октября 2019

У меня есть код ниже на C, который является простым XOR-шифром, и я пытаюсь распараллелить его, используя OpenMP. Я добавил простую директиву for, и она вызывает зашифрованный вывод. Я был бы признателен, если бы кто-нибудь мог помочь мне понять, почему это происходит.

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

void encryptDecrypt(char inpString[]) 
{ 
    // Define XOR key 
    // Any character value will work 
    char xorKey = 'P'; 

    // calculate length of input string 
    int len = strlen(inpString); 

    // perform XOR operation of key 
    // with every caracter in string
    #pragma omp parallel for 
    for (int i = 0; i < len; i++) 
    { 
        inpString[i] = inpString[i] ^ xorKey; 
        printf("%c",inpString[i]); 
    } 
} 

// Driver program to test above function 
int main() 
{ 
    char sampleString[] = "GeeksforGeeks"; 

    // Encrypt the string 
    printf("Encrypted String: "); 
    encryptDecrypt(sampleString); 
    printf("\n"); 

    // Decrypt the string 
    printf("Decrypted String: "); 
    encryptDecrypt(sampleString);
    printf("\n"); 

    return 0; 
}

Пример вывода без OpenMP:

Зашифрованная строка: 55; # 6? "55; #

Расшифрованная строка: GeeksforGeeks

Пример вывода с OpenMP:

Зашифрованная строка: 5 ## 6? "55 ;; 5

Расшифрованная строка: GesfoGeresekk

Ответы [ 2 ]

3 голосов
/ 09 октября 2019

Потоки OpenMP не запускаются в каком-либо определенном порядке, если только вы явно не попросите их сделать это.

Возможно, вам следует удалить printf из цикла и вывести его наружу после выполнения цикла (всепотоки выполнили), а затем выведите строку для детерминированного вывода.

Интересно, что ваша строка содержит правильное зашифрованное и расшифрованное значение. Просто порядок печати неверен.

[..]

#pragma omp parallel for 
for (int i = 0; i < len; i++) 
{ 
    inpString[i] = inpString[i] ^ xorKey; 
    // printf("%c",inpString[i]);  Remove this
}

[..]

// Encrypt the string 
printf("Encrypted String: "); 
encryptDecrypt(sampleString); 
printf("%s\n", sampleString);  // Add print here

[..]
0 голосов
/ 13 октября 2019

"Вундеркинды" позволяют вам Захватить пятнышко (на самом деле там подготовлено --2-- пятнышек ...)

#pragma omp parallel for -блок был очевидной уловкой, чтобы запутать omp -фрешманов, но был еще один сюрприз, который Мохит выразил в следующих словах:

Интересно, что ваша строка содержит правильное зашифрованное ирасшифрованное значение.


enter image description here

пока,
часть изменения строки была чистой извук, на самом деле там не было ничего действительно "интересного" (ужасно неэффективно, да, но полностью законно). Это упорядоченная, взаимно не взаимодействующая, простая [i] выровненная, прямая модификация sampleString[] несвязанных char значений, но попытка получить все эти printf() -созданные индивидуумы(char) -s положили «назад» в один ряд, в чистой и понятной для человека последовательности было пятнышко номер один (это было очевидно).

Программа (внутри live-analyzer-debugger-IDE) stdout однако читает, как если бы первые (правильно упорядоченные) (char) -ы были идентичны в " Ge ... для Ge ... "(чтобы получить одинаково XOR -ed выход (char) -s" 55 . .. 55 ... "в строках XOR, не так ли?

[13]: -->GeeksforGeeks<--
NEXT: will encrypt the original String:
[13]: -->55;#6?"55;#<--
[13]: -->55;#6?"55;#<--
NEXT: will decrypt the (now) encrypted String:
[13]: -->GeeksforGeeks<--
[13]: -->55;#6?"55;#<--

И XOR -Отпечатки также выглядят как-то «короче», не так ли?
Черт, они делают и по причине: о). ,,,,,,,,,,,,,,,,,,,,,,,чтобы сбить вас с толку

[37]: -->GagarinGonnaGroomGreetingsGospelGoers<--
NEXT: will encrypt the original String:
[37]: -->171"9>?>>1"??="55$9>7#?# 5<?5"#<--
NEXT: will encrypt the original String:
[37]: -->171"9>?>>1"??="55$9>7#?# 5<?5"#<--
[37]: -->171"9>?>>1"??="55$9>7#?# 5<?5"#<--
NEXT: will decrypt the (now) encrypted String:
[37]: -->GagarinGonnaGroomGreetingsGospelGoers<--
[37]: -->171"9>?>>1"??="55$9>7#?# 5<?5"#<--

Platform's sizeof(char) was 1

Не стесняйтесь читать line 49 в live-IDE выше и можете поэкспериментировать с этим Double-Speck

...