2010-10-20 7 views
2

J'ai créé des programmes qui utilisent le cryptage XOR de données avant de le comprendre complètement, mais comment puis-je l'implémenter dans un programme afin que les littéraux de chaîne soient cryptés? Par exemple, je ne veux pas utiliser:XOR String Encryption/Decryption

string name = "My name is Matt"; 

Cela provoquerait un « Mon nom est Matt » être situé dans l'exécutable. Je suppose que je devrais crypter le littéral avec un programme séparé, mais ma vraie question est de savoir comment stocker la chaîne cryptée dans l'exécutable (de préférence pas dans un fichier séparé)?

Encore une fois, je comprends parfaitement comment décrypter les chaînes et comment cela fonctionne, j'ai juste besoin de savoir comment transporter les chaînes cryptées dans le résultat compilé.

Merci pour votre temps, je l'apprécie vraiment.

+4

Par "cryptage XOR", vous voulez vraiment dire que vous "compliquez légèrement l'extraction d'informations en utilisant une transformation XOR", n'est-ce pas? Parce qu'un algorithme dit de "chiffrement XOR" n'offre vraiment aucune sécurité. –

+2

Le chiffrement XOR est fiable à 100% avec un rembourrage unique ... –

+0

Compte tenu de sa «pleine compréhension» du chiffrement XOR, je suis surpris de savoir où et comment l'information est stockée. : P Gardez-le dans un fichier texte ASCII dans le répertoire avec le programme, et insérez une lettre 'Z' toutes les autres lettres. : P –

Répondre

1

En supposant que vous symboles stripping, vous devriez être en mesure de sortir avec faire quelque chose comme:

static const char *kMyNameIsMatt = "arosietnarsoitne"; // Where that mess is the XOR-obfuscated string. 
string name = kMyNameIsMatt; 
std::cout << XORUnobfuscate(name) << std::endl; 

Si vous n'êtes pas Décapage des symboles, alors vous pouvez masquer les symboles, ainsi, en utilisant quelque chose comme :

#define kMyNameIsMatt ABC123XYZZY 
+0

Wow, c'est aussi simple que ça. Pour une raison quelconque, je pensais que les caractères cryptés que je devais coller auraient un problème d'encodage car ils pourraient être hors de la plage ASCII normale, mais tout ce que j'avais à faire était d'utiliser #define. – Matt

1

Si vous faites un XOR de bits, alors votre « string » contiendra probablement beaucoup de caractères non imprimables, et donc vous ne pouvez pas le définir via String str = "[something]". Votre meilleur pari est de le représenter comme un tableau d'entiers représentant chaque char. Ensuite, pour récupérer votre chaîne, juste XOR les différents caractères, et les ajouter tous ensemble pour former votre chaîne non cryptée.

0

Si vous utilisez des caractères ASCII, utilisez la notation de caractères hexadécimaux ...

void formatString(char *buffer, char *input) { 
    char *pos = buffer; 
    while (*input != '\0') { 
     sprintf(pos, "\\x%02x", (int)*input); 
     input++; 
     pos += 4; 
    } 
} 

void main() { 
    char buffer[100]; // 4 chars for every char in the input 
    char *original = "ABCD"; 
    int size = formatString(buffer, original); 
} 

Cela devrait vous donner une chaîne résultante comme "\ x41 \ x42 \ x43 \ x44" que vous pouvez mettre dans votre programme. Malheureusement quand vous XOR certains des octets résultants pourraient être null. Si vous vous retrouvez avec "\ x57 \ x00 \ x68 \ xf7" dans votre programme, la chaîne ne renverra qu'un seul caractère car la valeur null le terminera, vous devez donc stocker la taille de la chaîne séparément. Cela pourrait être géré par Base64 encodant la chaîne chiffrée. Sinon, si vous n'utilisez que ASCII 0-127, vous pouvez définir le bit 7 sur chaque caractère et le terminer par un caractère nul. Si vos valeurs XOR étaient 0x55, 0x42, 0x55, 0x55 qui transformerait "ABCD" à 0x14, 0x00, 0x16, 0x11, en définissant le bit 7 vous obtiendrez 0x94, 0x80, 0x96, 0x91:

void main() { 
    char encryptedString = "\x94\x80\x96\x91"; 
    char buffer[100]; 
    decryptString(buffer, encryptedString); 
    printf("Original: %s\n", buffer); 
} 

Où decryptString fait le XOR puis dépouille le bit 7 en ajoutant 0x7f.

Il y a beaucoup de code libre pour Base64, donc je voudrais juste coder Base64 les octets qui en résultent après XOR, puis Base64 décoder la chaîne avant XOR retour à l'original.

3

Première étape: écrire un programme qui crypte votre chaîne les imprime ensuite les numéros hexagonaux:

#include <iostream> 
#include <iomanip> 
#include <iostream> 

int main(int argc,char* argv[]) 
{ 
    std::string const value = argv[1]; 
    std::string const key = argv[2]; 

    std::cout << "string " << argv[3] << " (\""; 
    for(std::size_t loop = 0; loop < value.size(); ++loop) 
    { 
     std::cout << "\\x" 
        << std::hex 
        << std::setw(2) 
        << std::setfill('0') 
        << static_cast<unsigned int>(value[loop]^key[loop % key.size()]); 
    } 
    std::cout << "\"," << value.size() << ");\n"; 
} 

Étape 2: Lancez l'application pour chaque littéral. Il devrait sortir le code que vous pouvez passer dans votre application.

> ./a.exe Martin York Cool 
string Cool ("\x14\x0e\x00\x1f\x30\x01",6); 

Note: Comme la chaîne peut contenir maintenant le caractère NUL vous ne pouvez pas utiliser le constructeur de chaîne normale qui prend un C-String. Vous devez utiliser le constructeur qui prend un char * et une longueur.