{"id":1328,"date":"2025-06-10T17:20:54","date_gmt":"2025-06-10T16:20:54","guid":{"rendered":"https:\/\/workboot.fr\/ciela\/?page_id=1328"},"modified":"2025-06-10T18:21:14","modified_gmt":"2025-06-10T17:21:14","slug":"alice-et-bob-rsa","status":"publish","type":"page","link":"https:\/\/workboot.fr\/ciela\/alice-et-bob-rsa\/","title":{"rendered":"Alice et Bob RSA"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">on trouve le projet complet  <a href=\"https:\/\/workboot.fr\/Download\/langageC\/projet_rsa16.tar\">projetRSA16<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">genrsa16.c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce code va nous g\u00e9n\u00e9rer une cl\u00e9 priv\u00e9e et une cl\u00e9 publique<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;time.h>\n\n\/**\n * is_prime - Teste si un entier n est premier (test simple)\n * @n: le nombre \u00e0 tester\n * \n * Retourne 1 si premier, 0 sinon\n * \n * M\u00e9thode : on teste la divisibilit\u00e9 par tous les entiers impairs de 3 \u00e0 sqrt(n)\n *\/\nigenrnt is_prime(int n) {\n    if (n &lt; 2) return 0;       \/\/ Les nombres &lt; 2 ne sont pas premiers\n    if (n == 2) return 1;      \/\/ 2 est premier\n    if (n % 2 == 0) return 0;  \/\/ Les nombres pairs > 2 ne sont pas premiers\n\n    for (int i = 3; i * i &lt;= n; i += 2) {\n        if (n % i == 0) return 0; \/\/ Divisible par i -> pas premier\n    }\n    return 1; \/\/ Aucun diviseur trouv\u00e9 -> premier\n}\n\n\/**\n * random_prime - G\u00e9n\u00e8re un nombre premier impair al\u00e9atoire dans &#91;min..max]\n * \n * Boucle jusqu'\u00e0 obtenir un nombre premier\n *\/\nint random_prime(int min, int max) {\n    int p;\n    do {\n        p = rand() % (max - min + 1) + min; \/\/ Tirage al\u00e9atoire dans l'intervalle\n        if (p % 2 == 0) p++;                \/\/ S'assurer que p est impair\n    } while (!is_prime(p));                 \/\/ R\u00e9p\u00e9ter tant que p n'est pas premier\n    return p;\n}\n\n\/**\n * egcd - Algorithme d'Euclide \u00e9tendu pour calculer le PGCD de a et b\n *       et trouver les coefficients x et y tels que a*x + b*y = gcd(a, b)\n * \n * Retourne le PGCD et remplit x et y par les coefficients de B\u00e9zout\n *\/\nint egcd(int a, int b, int *x, int *y) {\n    if (b == 0) {\n        *x = 1; *y = 0;\n        return a; \/\/ PGCD trouv\u00e9 = a\n    }\n    int x1, y1;\n    int gcd = egcd(b, a % b, &amp;x1, &amp;y1);  \/\/ Appel r\u00e9cursif\n    *x = y1;\n    *y = x1 - (a \/ b) * y1;               \/\/ Mise \u00e0 jour des coefficients\n    return gcd;\n}\n\n\/**\n * modinv - Calcul de l'inverse modulaire de e modulo phi\n *          C'est-\u00e0-dire trouver d tel que (d*e) mod phi = 1\n * \n * Utilise l'algorithme d'Euclide \u00e9tendu\n * Retourne -1 si l'inverse n'existe pas\n *\/\nint modinv(int e, int phi) {\n    int x, y;\n    int g = egcd(e, phi, &amp;x, &amp;y);\n    if (g != 1) return -1; \/\/ Inverse modulaire n'existe que si e et phi sont premiers entre eux\n    return (x % phi + phi) % phi; \/\/ On normalise x pour qu'il soit positif\n}\n\nint main() {\n    \/\/ Initialisation du g\u00e9n\u00e9rateur de nombres al\u00e9atoires avec l'heure actuelle\n    srand(time(NULL));\n\n    \/\/ G\u00e9n\u00e9ration al\u00e9atoire de deux nombres premiers p et q distincts dans &#91;50..100]\n    int p = random_prime(50, 100);\n    int q;\n    do {\n        q = random_prime(50, 100);\n    } while (q == p); \/\/ On s'assure que p et q soient diff\u00e9rents\n\n    int n = p * q;           \/\/ Calcul de n = p*q, utilis\u00e9 pour la cl\u00e9 publique et priv\u00e9e\n    int phi = (p - 1) * (q - 1); \/\/ Calcul de phi(n), la fonction d'Euler\n\n    \/\/ Choix de e : on cherche un nombre impair e premier avec phi\n    int e;\n    for (e = 3; e &lt; phi; e += 2) {\n        int x, y;\n        if (egcd(e, phi, &amp;x, &amp;y) == 1)\n            break; \/\/ e trouv\u00e9, premier avec phi\n    }\n\n    \/\/ Calcul de d, l'inverse modulaire de e modulo phi\n    int d = modinv(e, phi);\n    if (d == -1) {\n        fprintf(stderr, \"Erreur : pas d'inverse modulaire pour e=%d\\n\", e);\n        return EXIT_FAILURE;\n    }\n\n    \/\/ Affichage des r\u00e9sultats (cl\u00e9s publique et priv\u00e9e)\n    printf(\"p = %d, q = %d\\n\", p, q);\n    printf(\"n = %d\\n\", n);\n    printf(\"phi = %d\\n\", phi);\n    printf(\"Cl\u00e9 publique (e, n) : (%d, %d)\\n\", e, n);\n    printf(\"Cl\u00e9 priv\u00e9e  (d, n) : (%d, %d)\\n\", d, n);\n\n    return EXIT_SUCCESS;\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># compilation du code\ngcc genrsa16.c -o genrsa16<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>bruno@debian:~\/Works\/langageC\/rsa16\/projet_rsa16$ .\/genrsa16 \np = 73, q = 59\nn = 4307\nphi = 4176\nCl\u00e9 publique (e, n) : (5, 4307)\nCl\u00e9 priv\u00e9e  (d, n) : (3341, 4307)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">on va noter la cl\u00e9 public d&rsquo;Alice  , ici 5 et 4307  que Alice va diffuser , surtout a Bob , elle va garder la cl\u00e9 priv\u00e9e  de son cot\u00e9 bien secr\u00e8te  3341 4307<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">rsa16.c <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\n#include &lt;stdlib.h>\n\ntypedef unsigned short u16;\n\n\/**\n * modexp - Calcul rapide de l\u2019exponentiation modulaire (base^exp mod modulo)\n *\/\nu16 modexp(u16 base, u16 exp, u16 mod) {\n    u16 result = 1;\n    base %= mod;\n    while (exp > 0) {\n        if (exp &amp; 1) result = (result * base) % mod;\n        base = (base * base) % mod;\n        exp >>= 1;\n    }\n    return result;\n}\n\nint main(int argc, char *argv&#91;]) {\n    if (argc != 4) {\n        fprintf(stderr, \"Usage : %s fichier.txt e n\\n\", argv&#91;0]);\n        return EXIT_FAILURE;\n    }\n\n    u16 e = (u16)atoi(argv&#91;2]);\n    u16 n = (u16)atoi(argv&#91;3]);\n\n    FILE *in = fopen(argv&#91;1], \"rb\");\n    if (!in) {\n        perror(\"fopen input\");\n        return EXIT_FAILURE;\n    }\n\n    char outname&#91;256];\n    snprintf(outname, sizeof(outname), \"%s.chi\", argv&#91;1]);\n    FILE *out = fopen(outname, \"wb\");\n    if (!out) {\n        perror(\"fopen output\");\n        fclose(in);\n        return EXIT_FAILURE;\n    }\n\n    int ch;\n    while ((ch = fgetc(in)) != EOF) {\n        u16 encrypted = modexp((u16)ch, e, n);\n        fwrite(&amp;encrypted, sizeof(u16), 1, out);\n    }\n\n    fclose(in);\n    fclose(out);\n    printf(\"Fichier chiffr\u00e9 : %s\\n\", outname);\n    return EXIT_SUCCESS;\n}gedit rsa<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bob va lui faire un petit message secret en code ascii<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"Bonjour Alice, voila mon message secret !\" > message.txt\ncat message.txt\nBonjour Alice, voila mon message secret !<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>bruno@debian:~\/Works\/langageC\/rsa16\/projet_rsa16$ .\/rsa16 message.txt 5 4307\nFichier chiffr\u00e9 : message.txt.chi\nbruno@debian:~\/Works\/langageC\/rsa16\/projet_rsa16$ cat message.txt.chi \ny\ufffd~y^\n\ufffdV\n \ufffd1\n   \ufffd\ufffd\ufffdV\n       \ufffdy1\n          \ufffdKV\n             |\n              y\ufffdV\n                 |\n                  \ufffd\ufffd\t\ufffd\tK\n                                 \t\ufffdV\n                                          \ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffdV\n                                                      \ufffd\ufffdb<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ce message est devenu illisible !<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bob le transmet \u00e0 Alice , qui dispose de sa cl\u00e9 priv\u00e9e<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">decrsa16.c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\n#include &lt;stdlib.h>\n\n\/**\n * modexp - Calcul rapide de l\u2019exponentiation modulaire (base^exp mod modulo)\n * \n * @param base La base (entier)\n * @param exp L'exposant (cl\u00e9 priv\u00e9e d)\n * @param mod Le modulo n\n * @return (base^exp) mod mod\n *\/\ntypedef unsigned short u16;\nu16 modexp(u16 base, u16 exp, u16 mod) {\n    u16 result = 1;\n    base %= mod;\n    while (exp > 0) {\n        if (exp &amp; 1) result = (result * base) % mod;\n        base = (base * base) % mod;\n        exp >>= 1;\n    }\n    return result;\n}\n\nint main(int argc, char *argv&#91;]) {\n    if (argc != 4) {\n        fprintf(stderr, \"Usage : %s fichier.chi d n\\n\", argv&#91;0]);\n        return EXIT_FAILURE;\n    }\n\n    FILE *in = fopen(argv&#91;1], \"rb\");\n    if (!in) {\n        perror(\"fopen\");\n        return EXIT_FAILURE;\n    }\n\n    \/\/ Conversion des param\u00e8tres d et n pass\u00e9s en argument (cl\u00e9 priv\u00e9e)\n    u16 d = (u16)atoi(argv&#91;2]);\n    u16 n = (u16)atoi(argv&#91;3]);\n\n    FILE *out = fopen(\"dechiffre.txt\", \"wb\");\n    if (!out) {\n        perror(\"fopen output\");\n        fclose(in);\n        return EXIT_FAILURE;\n    }\n\n    u16 chunk;\n    \/\/ Lecture bloc par bloc (2 octets) du fichier chiffr\u00e9\n    while (fread(&amp;chunk, sizeof(u16), 1, in) == 1) {\n        \/\/ D\u00e9chiffrement RSA : m = c^d mod n\n        u16 decrypted = modexp(chunk, d, n);\n        fputc((char)decrypted, out);\n    }\n\n    fclose(in);\n    fclose(out);\n    printf(\"D\u00e9chiffr\u00e9 dans dechiffre.txt\\n\");\n    return EXIT_SUCCESS;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">bruno@debian:~\/Works\/langageC\/rsa16\/projet_rsa16$ .\/decrsa16 message.txt.chi 3341 4307<br>D\u00e9chiffr\u00e9 dans dechiffre.txt<br>bruno@debian:~\/Works\/langageC\/rsa16\/projet_rsa16$ cat dechiffre.txt<br>Bonjour Alice, voila mon message secret !<br>bruno@debian:~\/Works\/langageC\/rsa16\/projet_rsa16$<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A vous de jouer <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">vous pouvez tester avec un autre jeu de cl\u00e9s<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>on trouve le projet complet projetRSA16 genrsa16.c Ce code va nous g\u00e9n\u00e9rer une cl\u00e9 priv\u00e9e et une cl\u00e9 publique on va noter la cl\u00e9 public d&rsquo;Alice , ici 5 et 4307 que Alice va diffuser , surtout a Bob , elle va garder la cl\u00e9 priv\u00e9e de son cot\u00e9 bien secr\u00e8te 3341 4307 rsa16.c Bob [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-1328","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"admin","author_link":"https:\/\/workboot.fr\/ciela\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"on trouve le projet complet projetRSA16 genrsa16.c Ce code va nous g\u00e9n\u00e9rer une cl\u00e9 priv\u00e9e et une cl\u00e9 publique on va noter la cl\u00e9 public d&rsquo;Alice , ici 5 et 4307 que Alice va diffuser , surtout a Bob , elle va garder la cl\u00e9 priv\u00e9e de son cot\u00e9 bien secr\u00e8te 3341 4307 rsa16.c Bob\u2026","_links":{"self":[{"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/pages\/1328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/comments?post=1328"}],"version-history":[{"count":7,"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/pages\/1328\/revisions"}],"predecessor-version":[{"id":1345,"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/pages\/1328\/revisions\/1345"}],"wp:attachment":[{"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/media?parent=1328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}