Cryptographie RSA

Chiffrement RSA

Principe :

Si Bob désire que l’on puisse communiquer avec lui de façon secrète, il procède de la manière suivante :

  1. Bob engendre deux grands nombres premiers p et q (test de primalité).
  2. Bob calcule n = p q donc ɸ(n) = (p-1)(q-1), ɸ indicateur d’Euler.
  3. Bob choisit un nombre aléatoire b avec 1 b ɸ(n) tel que pgcd(b, ɸ(n) ) = 1.
  4. Bob calcule l’inverse de p modulo ɸ(n), noté e, c’est-à-dire : b*e ≡ 1 mod ɸ(n) (Algorithme d’Euclide généralisé).
  5. Bob publie (n, b) (clef public) et garde e qui forme la clef secrète.

Fantasio veut envoyer un message M (M < n) à Bob, il calcule :

C = M^b mod n et envoi C à Bob.

Bob reçoit C et calcule : C^e mod n =M

 

Notions mathématiques :

Considérons l’ensemble suivant : En = {0, 1, 2, …, n-1}.

Théorème :

Soit a appartient à En, alors a est inversible ssi pgcd(a,n) = 1, c’est-à-dire, a et n sont premiers entre eux. Ainsi, si n est premier, alors chaque élément de En est inversible, sauf 0 .

Définition : Indicateur d’Euler noté ɸ.

Il indique le nombre d’élément inversible de En.

Propriétés de ɸ(n) :

  1.  Si n est premier, alors ɸ(n) = n-1.
  2. Si m et n sont premiers entre eux, ɸ(m*n) = ɸ(m)* ɸ(n).
  3. Si m et n sont premiers, alors ɸ(m*n) = (m-1)*(n-1).
  4. Si a est inversible de En, alors a^ ɸ(n) 1 mod n.

Algorithme de recherche des nombres premiers

Aujourd’hui, nous nous intéressons aux nombres premiers et à la façon de les trouver. Pour cela, voilà un algorithme assez simple qui permet de trouver un nombre n de nombre premier. Dans sa première version, l’algorithme recommençait à calculer à partir de 5 (si ma mémoire est bonne ;) ) à chaque exécution. Dans sa version actuelle, nous pouvons maintenant reprendre les calculs à partir du dernier nombre premier trouvé. Quelques améliorations pourront néanmoins être apporter comme la possibilité d’interrompre le programme alors qu’il teste des nombres et de le relancer sans avoir à repartir du dernier nombre premier, la gestion des grands nombres pourrait être à revoir. Nous pouvons également envisager la division du fichier contenant les nombres premiers en plusieurs autres fichiers tous les x nombres.

L’algorithme est présenté en code C et repose sur ce que mon professeur de sécurité désignait il y a quelques jours comme la « méthode naïve »; puisqu’il existe d’autres méthodes, permettant de s’assurer qu’un nombre n’est pas premier entre autres (mais pas d’équivalence ici, si le nombre n’est pas premier, le théorème ne permet pas de monter qu’il l’est) et dont je parlerais certainement dans un autre article.

Au jour d’aujourd’hui, notre fichier fait 969 376 620 octets et est trop grand pour être ouvert par certains éditeur de texte :D.  Pour déterminer si un nombre est premier, l’algorithme va regarder le résultat de la division du nombre testé par les nombres premiers déjà présent dans le fichier. Si le reste vaut 0, le nombre testé est divisible par un autre nombre que 1 ou lui-même, il n’est donc pas premier. On peut arrêter ce test, lorsque le nombre premier utilisé dans la division euclidienne est supérieur à la racine carré du nombre testé et ainsi gagner du temps. De même, l’incrémentation des nombres testés de 2 en 2 à partir d’un entier impair permet de ne jamais tester les nombres pairs puisque nous les savons tous divisibles par 2. Le lien vers un dossier contenant le code et les fichiers qu’il utilise: Algorithme Nombres Premiers. Place maintenant au programme:

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

int premier(int test);

int main(void)
{
    /*VARIABLE:
      recherche: le nombre de nombre premier à rechercher
      dernier: le dernier nombre testé
        lors de l'appel précédent au programme,
        contenu dans dernier.txt*/

    int recherche, dernier;
    FILE *fichier_dernier_nbr;
    FILE  *fichier;
    recherche=100;
    dernier=0;

    /*Initialisation du dernier nombre testé
      dernier est obligatoirement impair*/
    fichier=NULL;
    fichier_dernier_nbr = NULL;
    fichier_dernier_nbr = fopen("dernier.txt", "r+");

    if (fichier_dernier_nbr != NULL)
    {
        fscanf(fichier_dernier_nbr, "%d", &dernier);
        fclose(fichier_dernier_nbr);
    }

    /*On recherche autant de nombre premier
       que le contenu de recherche*/
    while(recherche>0)
    {
        if(premier(dernier))
        {
            /*Le nombre testé est premier*/
            /*printf("%d:Premier\n", dernier);*/
            /*On enregistre le nombre à la fin du fichier*/
            fichier = fopen("test.txt", "r+");
            fseek(fichier, 0, SEEK_END);
            fprintf(fichier, "%d\n", dernier);
            fclose(fichier);
            /*On décrémente le nombre de nombre premier
              encore à trouver*/
            recherche--;
        }
        dernier=dernier+2;
    }
    /*On enregistre le dernier à la fin du fichier*/
    fichier = fopen("dernier.txt", "w+");
    fseek(fichier, 0, SEEK_SET);
    fprintf(fichier, "%d", dernier);
    fclose(fichier);

    printf("Operation effectuee avec succes.\n");

    return EXIT_SUCCESS;
}

/*Renvoi 1 si le nombre est un nombre premier*/
int premier(int test)
{
    int nb_premier;
    int borne=0;

    FILE* fichier = NULL;
    fichier = fopen("test.txt", "r+");

    if (fichier != NULL)
    {

        while(feof(fichier)==0 && borne==0)
        {    
            fscanf(fichier, "%d", &nb_premier);
            /*printf("%d\n", nb_premier);*/
            /*Nombre divisible par un nombre premier,
              premier(test)=0*/
            if(test%nb_premier==0)
            {
                fclose(fichier);
                return 0;
                }
            /*Si la racine carré du nombre testé est inférieure au
              nombre premier actuel,inutile de continuer le test*/
            if(nb_premier>sqrt(test))
            {borne=1;}
        }

        fclose(fichier);
        if(borne==1)
        {return 1;}
    }
    return 0;
}

Illustration: illustrer.fr

Sécurité Informatique: Intro et Théorie

Principes fondamentaux

La sécurité informatique est un ensemble de moyens techniques, juridiques, organisationnels et humains pour garantir la sécurité des systèmes d’information (SI). Les critères de la sécurité des SI sont :

  • La disponibilité : Consiste à assurer l’accessibilité de la ressource informatique (utilisable en un temps de réponse acceptable) et la possibilité de mener à terme une session de travail.
  • L’intégrité : Consiste à pouvoir confirmer que les données, les traitements et les serveurs n’ont pas été altérés, modifiés ou détruits de façon intentionnelle ou accidentelle.
  • La confidentialité : Consiste en le maintien du secret des informations, à savoir que l’information est seulement accessible à ceux qui ont droits.

Remarque :

Bien que la sécurité des SI repose sur ces trois critères, le poids donné à chaque critère dépend de l’institution.

Exemple :

Banque → Intégrité

Militaire → Confidentialité

Fournisseur d’accès internet → Disponibilité

 

Deux critères s’ajoutent aux trois premiers :

  • Traçabilité : Consiste à s’assurer qu’un événement a eu lieu et que seuls les entités identifiées sont à l’origine de l’événement. On parle alors de : authentification, non-reproduction, compatibilité, journalisation.
  • Auditabilité : Consiste en la capacité du système à garantir la présence des informations nécessaires à une analyse ultérieure.

 

Périmètre de sécurité 

La sécurité des SI se décline en plusieurs périmètres de sécurité. Nous parlerons donc de :

  • Sécurité physique : Elle concerne l’environnement dans lequel se situent les systèmes et leurs moyens de maîtrise.
  • Sécurité de l’exploitation : Concerne la grande partie des aspects organisationnels, de gestion et de surveillance, qui touchent au bon fonctionnement des SI.
  • Sécurité logique : Elle concerne l’ensemble des mécanismes de sécurité par logiciel.
  • Sécurité applicative : Elle concerne la sécurité des applications installées ou en phase de réalisation.

On peut ajouter la sécurité des télécommunications et la sécurité juridique.

Exemple :

Programmer proprement ->Sécurité applicative

Configuration d’un pare-feu ->Sécurité des télécommunications

Création de configuration et des mises à jour ->Sécurité de l’exploitation

Installation d’antivirus ->Sécurité logique

Protection d’accès ( porte à code) ->Sécurité physique

Analyse des logs ->Sécurité de l’exploitation

Redondance du matériel ->Sécurité physique

 

Les 7 principes de base de sécurité

  1. Moindre privilège : Ce principe stipule que chaque utilisateur et chaque module d’un système ne doit posséder que les droits minimaux pour effectuer ses tâches.
  2. Goulet d’étranglement : Ce principe consiste à éviter tout moyen possible de contourner les points d’accessibilité.
  3. Défense en profondeur : Elle est réalisée en utilisant plusieurs mécanismes de protection redondants.
  4. Maillon le plus faible : Un système de protection n’est jamais plus efficace que son élément le plus faible.
  5. Déni par défaut : Consiste de partir du principe qui consiste à tout interdire sauf ce qui est explicitement permis.
  6. Simplicité : Plus le système de protection est simple, plus il a de chances d’être configuré et maintenu. Il est ainsi capable de fournir une sécurité presque sans faille car il est plus facile à documenter et à valider.
  7. Participation des utilisateurs : Un système de sécurité n’est efficace que si tous les utilisateurs adhèrent à ses principes.

Horloge Binaire Via Arduino + LoL Shield

Aujourd’hui, premier mars, je partage avec vous le code permettant l’affichage d’une horloge binaire sur votre LoL Shield contrôlé par Arduino. Cette horloge se divise en trois colonnes correspondant bien évidemment aux heures, minutes et secondes. Chaque colonne fait deux leds de large. Pour être correct, l’heure doit être initialisée à chaque fois que l’on relance le Arduino et il faut alors renvoyer le programme sur celui-ci. Il serait possible de synchroniser automatiquement l’horloge en se servant d’un shield Ethernet pour récupérer l’heure.

Quelques mots sur la fonction millis(). Cette fonction renvoie le nombre de millisecondes écoulées depuis que le Arduino a commencé à exécuter le programme en cours. Ce nombre revient à 0 après environ 50 jours. Ainsi, cette fonction va nous permettre d’incrémenter les secondes. Nous utiliserons le code suivant:

static unsigned long lastTick = 0;

if (millis() – lastTick >= 1000) {
 lastTick = millis();
 seconde++;}

Si le nombre de millisecondes depuis le début du programme moins le moment du dernier test est supérieur ou égale à 1 000, nous stockons le nombre de ms depuis le début du programme dans lastTick et nous incrémentons les secondes, dans le cas contraire, on ne change rien. Ainsi, toutes les 1 000 ms, les secondes seront incrémentées.

Pour la fonction LedSign::Set, la syntaxe est la suivante: LedSign::Set( C, L, E); . Avec C, le numéro de la colonne de la led concernée, L le numéro de la ligne et E l’état: 0 éteinte, 1 allumée. On a C = {0…13}, L = {0…8} et E = {0, 1}.

Voilà donc le code associé; la façon dont il est présenté ne me satisfait pas du tout. Pas évident d’afficher clairement du code avec WordPress…Donc finalement, j’ai trouvé un autre moyen, fournir le code directement dans un fichier texte: Horloge Binaire LoLShield

#include <avr/pgmspace.h>  //AVR library for writing to ROM
#include <Charliplexing.h> //Imports the library, which needs to be
//Initialized in setup.

void setup() {
  LedSign::Init();  //Initializes the screen
}

int seconde = 42;
int minute = 42;
int heure = 11;
int reste_heure,reste_minute, reste_seconde;

void loop() {
 static unsigned long lastTick = 0;

 //Incrémentation des secondes
 if (millis() - lastTick >= 1000) {
   lastTick = millis();
   seconde++;
 }


/*Remise à zéro des variables si celles-ci atteignent ou dépassent 60 pour les minutes et les secondes et 12 pour les heures.*/
 if(seconde >= 60) {
   minute++;
   seconde = 0;
 }

if(minute >= 60) {
 heure++;
 minute = 0;
}

if(heure >= 12) {
 heure = 0;
}

//calcul des leds allumées pour les heures
if(heure/8>=1) {
  LedSign::Set( 1, 5, 1);
  LedSign::Set( 2, 5, 1);
  reste_heure=heure%8;
} else {
  LedSign::Set( 1, 5, 0);
  LedSign::Set( 2, 5, 0);
  reste_heure=heure;
}

 if(reste_heure/4>=1) {
  LedSign::Set( 1, 6, 1);
  LedSign::Set( 2, 6, 1);
  reste_heure=reste_heure%4;
 } else {
  LedSign::Set( 1, 6, 0);
  LedSign::Set( 2, 6, 0);
 }

 if(reste_heure/2>=1) {
  LedSign::Set( 1, 7, 1);
  LedSign::Set( 2, 7, 1);
  reste_heure=reste_heure%2;
 } else {
  LedSign::Set( 1, 7, 0);
  LedSign::Set( 2, 7, 0);
 }

 if(reste_heure/1>=1) {
  LedSign::Set( 1, 8, 1);
  LedSign::Set( 2, 8, 1);
  reste_heure=reste_heure%1;
 } else {
  LedSign::Set( 1, 8, 0);
  LedSign::Set( 2, 8, 0);
 }

//calcul des leds allumées pour les minutes
 if((minute/32)>=1) {
  LedSign::Set( 6, 3, 1);
  LedSign::Set( 7, 3, 1);
  reste_minute=minute%32;
 } else {
  LedSign::Set( 6, 3, 0);
  LedSign::Set( 7, 3, 0);
  reste_minute=minute;
}

 if((reste_minute/16)>=1) {
  LedSign::Set( 6, 4, 1);
  LedSign::Set( 7, 4, 1);
  reste_minute=reste_minute%16;
 } else {
  LedSign::Set( 6, 4, 0);
  LedSign::Set( 7, 4, 0);
 }

 if((reste_minute/8)>=1) {LedSign::Set( 6, 5, 1); LedSign::Set( 7, 5, 1);reste_minute=reste_minute%8;} else {LedSign::Set( 6, 5, 0); LedSign::Set( 7, 5, 0);}

 if((reste_minute/4)>=1) {LedSign::Set( 6, 6, 1); LedSign::Set( 7, 6, 1);reste_minute=reste_minute%4;} else {LedSign::Set( 6, 6, 0); LedSign::Set( 7, 6, 0);}

 if((reste_minute/2)>=1) {LedSign::Set( 6, 7, 1); LedSign::Set( 7, 7, 1);reste_minute=reste_minute%2;} else {LedSign::Set( 6, 7, 0); LedSign::Set( 7, 7, 0);}

 if((reste_minute/1)>=1) {LedSign::Set( 6, 8, 1); LedSign::Set( 7, 8, 1);reste_minute=reste_minute%1;} else {LedSign::Set( 6, 8, 0); LedSign::Set( 7, 8, 0);}




//calcul des leds allumées pour les secondes
 if((seconde/32)>=1) {LedSign::Set( 11, 3, 1); LedSign::Set( 12, 3, 1);reste_seconde=seconde%32;} else {LedSign::Set( 11, 3, 0); LedSign::Set( 12, 3, 0);reste_seconde=seconde;}
 if((reste_seconde/16)>=1) {LedSign::Set( 11, 4, 1); LedSign::Set( 12, 4, 1);reste_seconde=reste_seconde%16;} else {LedSign::Set( 11, 4, 0); LedSign::Set( 12, 4, 0);}
 if((reste_seconde/8)>=1) {LedSign::Set( 11, 5, 1); LedSign::Set( 12, 5, 1);reste_seconde=reste_seconde%8;} else {LedSign::Set( 11, 5, 0); LedSign::Set( 12, 5, 0);}
 if((reste_seconde/4)>=1) {LedSign::Set( 11, 6, 1); LedSign::Set( 12, 6, 1);reste_seconde=reste_seconde%4;} else {LedSign::Set( 11, 6, 0); LedSign::Set( 12, 6, 0);}
 if((reste_seconde/2)>=1) {LedSign::Set( 11, 7, 1); LedSign::Set( 12, 7, 1);reste_seconde=reste_seconde%2;} else {LedSign::Set( 11, 7, 0); LedSign::Set( 12, 7, 0);}
 if((reste_seconde/1)>=1) {LedSign::Set( 11, 8, 1); LedSign::Set( 12, 8, 1);reste_seconde=reste_seconde%1;} else {LedSign::Set( 11, 8, 0); LedSign::Set( 12, 8, 0);}

}

L’Arduino qu’est-ce donc ?

L’Arduino vous n’en avez pas encore entendu parler ? L’Arduino est tout simplement une petite carte bleue de fabrication Italienne, bien sûr elle ne vous permettra pas de payer vos achats dans le magasin du coin, mais c’est ce qui pourra transformer vos projets rêvés en projets concrets.

L’Arduino est une plateforme open-source programmable de petite taille. Qui est basée sur un micro-contrôleur de la famille des « Atmega ». Un IDE est disponible, permettant d’écrire, compiler et transférer des programmes vers la carte. Le but étant de contrôler des entrées et sorties, pour interagir avec le monde extérieur.

Il existe de plus en plus de « shield » en français « bouclier » qui se fixe sur le dessus de la carte. Comme le « Lots of Led Shield »: Lol Shield.

De plus la carte Arduino possède une communauté grandissante d’utilisateur, une plus en plus large gamme de programmes d’exemples, une quantité florissante de livre d’exercice d’application et autre petit montage.

L’Arduino en elle-même n’est pas qu’une seule et unique carte il existe plusieurs versions de cette carte ayant des applications différentes. La « nano », la « pro », « pro-mini », ou encore la « Duemilanove » et aussi la « Uno ». Et la spéciale vêtements la « LilyPad ».

Si ça vous intéresse rendez-vous sur le site officiel: http://www.arduino.cc/