Aide mémoire d’un cryptage simple en utilisant XOR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <stdio.h> // pour printf #include <string.h> // pour strlen char * codage_xor(char * texte, int taille, char * cle){ /* Cryptage "texte", avec la clef "cle". la taille du texte est passé, car on peut se retrouver avec des 0 une fois codé. Attention: le texte original est modifié ! */ int c_cle = 0; for(int c_txt=0; c_txt<taille; c_txt++){ // pour toute la chaine texte[c_txt] ^= cle[c_cle++]; // XOR du car. avec un car. de la clé if(!cle[c_cle]){ // si on est au bout de la clé c_cle=0; // on boucle } } return texte; } void main(void){ char texte[] = "Ceci est une phrase lambda à coder"; int taille = strlen(texte); // 1ère fois, codage codage_xor(texte, taille, "superclef"); printf("%s\n", texte); // 2è fois, décodage printf("%s\n", codage_xor(texte, taille, "superclef")); } |
La même chose en python3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import array # Permet de maniputer les chaine comme un tampon d'octets def codage_xor(tampon, cle): ''' Cryptage du "tampon", avec la clef "cle". ''' idx_cle = 0 l_cle = len(cle) pointeur = 0 taille = len(tampon) retour = array.array("B", range(taille)) # Tampon de retour while(pointeur < taille): # pour toute le tampon retour[pointeur] = tampon[pointeur] ^ cle[idx_cle] # XOR du car. avec un car. de la clé idx_cle = (idx_cle +1) % l_cle # Caratère suivant dans la clé ou retour au début pointeur += 1 return retour def to_array(_string): # Construit un tableau d'octets non signés à partir d'une chaine return array.array("B",_string.encode('utf-8')) def to_string(_array): # Construit une chaine à partir d'un tableau d'octets non signés return _array.tobytes().decode("utf8") if __name__=="__main__": cle = to_array("ma_super_cle") tampon = to_array("Mon texte") l = len(tampon) print("Message original {0}",tampon) print(to_string(tampon)) code = codage_xor(tampon, cle) print("Message codé {0}",code) print(to_string(code)) decode = codage_xor(code, cle) print("Message codé {0}",decode) print(to_string(decode)) |
Et en bonus, le calcul du checksum d’une chaine 🙂
1 2 3 4 5 6 7 8 9 10 |
unsigned char checksum(char * texte, int taille){ /* Calcul de la somme de contrôle d'une chaine */ unsigned char crc = 0; for(int n=0; n<taille; n++){ crc ^= texte[n]; } return crc; } |