2017-06-08 14 views
1

したがって、このコードからXOR暗号化を選択するようにデータを暗号化したいと思います。 Github コードブロックで実行すると、実行され、この結果を示していますXOR暗号化はVisual Studioのコードブロックでは動作しません2017

Encrypted: :=.43*-:8m2$.a 
Decrypted:kylewbanks.com0 

Process returned 0 (0x0) execution time : 0.025 s 
Press any key to continue. 

しかし、私は、Visual Studio 2017を使用して起動すると、それはこのエラーを示しています

Error (active) E0059 function call is not allowed in a constant expression 

配列を宣言するとき、私は、変数を置くカント意味するそうするための任意の方法があります私の暗号化イオンがVS2017で働く。 私は問題が定数を使用して変数を宣言すると、とにかくそれを使用するのが簡単な他の暗号化メソッドを使用すると思う、私はファイルのプレーンテキストを防ぐために安全である必要はない。 とにかくこれはコードのみです:

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

void encryptDecrypt(char *input, char *output) { 
    char key[] = {'K', 'C', 'Q'}; //Can be any chars, and any size array 

    int i; 
    for(i = 0; i < strlen(input); i++) { 
     output[i] = input[i]^key[i % (sizeof(key)/sizeof(char))]; 
    } 
} 

int main() { 
    char baseStr[] = "kylewbanks.com"; 

    char encrypted[strlen(baseStr)]; 
    encryptDecrypt(baseStr, encrypted); 
    printf("Encrypted:%s\n", encrypted); 

    char decrypted[strlen(baseStr)]; 
    encryptDecrypt(encrypted, decrypted); 
    printf("Decrypted:%s\n", decrypted); 
} 
+0

ソースコード?私のクリスタルボールは現時点では動作しません。 –

+1

あなたは何をしていますか*あなたのコードはどのように見えますか?あなたは[最小、完全で、そして証明可能な例](http://stackoverflow.com/help/mcve)を私たちに提供してもらえますか? –

+0

上記の文字列には「kylewbanks.com」と表示されているにすぎないので、この暗号化にも問題がありますが、解読されたデータには「kylewbanks.com0」と末尾に0が表示されます。 –

答えて

5

MSVCは、可変長配列をサポートしていません。 1つの方法は、メモリを割り当てることです。

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

void encryptDecrypt(char *input, char *output) { 
    char key[] = {'K', 'C', 'Q'}; //Can be any chars, and any size array 
    size_t i; 
    for(i = 0; i < strlen(input); i++) { 
     output[i] = input[i]^key[i % (sizeof(key)/sizeof(char))]; 
    } 
    output[i] = '\0';    // terminate 
} 

int main() { 
    char baseStr[] = "kylewbanks.com"; 
    size_t len = strlen(baseStr) + 1; 

    char *encrypted = malloc(len); 
    if(encrypted == NULL) { 
     // error handling 
    } 
    encryptDecrypt(baseStr, encrypted); 
    printf("Encrypted:%s\n", encrypted); 

    char *decrypted = malloc(len); 
    if(decrypted == NULL) { 
     // error handling 
    } 
    encryptDecrypt(encrypted, decrypted); 
    printf("Decrypted:%s\n", decrypted); 

    free(decrypted); 
    free(encrypted); 
} 

文字列ターミネータには余分なバイトが必要であり、文字列を終了する必要があります。

関連する問題