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; }  |