{"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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-1328","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Alice et Bob RSA - workboot<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/workboot.fr\/ciela\/alice-et-bob-rsa\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Alice et Bob RSA - workboot\" \/>\n<meta property=\"og:description\" content=\"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 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/workboot.fr\/ciela\/alice-et-bob-rsa\/\" \/>\n<meta property=\"og:site_name\" content=\"workboot\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-10T17:21:14+00:00\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/alice-et-bob-rsa\\\/\",\"url\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/alice-et-bob-rsa\\\/\",\"name\":\"Alice et Bob RSA - workboot\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/#website\"},\"datePublished\":\"2025-06-10T16:20:54+00:00\",\"dateModified\":\"2025-06-10T17:21:14+00:00\",\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/workboot.fr\\\/ciela\\\/alice-et-bob-rsa\\\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/#website\",\"url\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/\",\"name\":\"workboot\",\"description\":\"Open Source, Open Minds \",\"publisher\":{\"@id\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/#organization\",\"name\":\"workboot\",\"url\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/logo_ciel-dorian-1.png\",\"contentUrl\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/logo_ciel-dorian-1.png\",\"width\":1024,\"height\":950,\"caption\":\"workboot\"},\"image\":{\"@id\":\"https:\\\/\\\/workboot.fr\\\/ciela\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Alice et Bob RSA - workboot","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/workboot.fr\/ciela\/alice-et-bob-rsa\/","og_locale":"fr_FR","og_type":"article","og_title":"Alice et Bob RSA - workboot","og_description":"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 [&hellip;]","og_url":"https:\/\/workboot.fr\/ciela\/alice-et-bob-rsa\/","og_site_name":"workboot","article_modified_time":"2025-06-10T17:21:14+00:00","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/workboot.fr\/ciela\/alice-et-bob-rsa\/","url":"https:\/\/workboot.fr\/ciela\/alice-et-bob-rsa\/","name":"Alice et Bob RSA - workboot","isPartOf":{"@id":"https:\/\/workboot.fr\/ciela\/#website"},"datePublished":"2025-06-10T16:20:54+00:00","dateModified":"2025-06-10T17:21:14+00:00","inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/workboot.fr\/ciela\/alice-et-bob-rsa\/"]}]},{"@type":"WebSite","@id":"https:\/\/workboot.fr\/ciela\/#website","url":"https:\/\/workboot.fr\/ciela\/","name":"workboot","description":"Open Source, Open Minds ","publisher":{"@id":"https:\/\/workboot.fr\/ciela\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/workboot.fr\/ciela\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/workboot.fr\/ciela\/#organization","name":"workboot","url":"https:\/\/workboot.fr\/ciela\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/workboot.fr\/ciela\/#\/schema\/logo\/image\/","url":"https:\/\/workboot.fr\/ciela\/wp-content\/uploads\/2025\/05\/logo_ciel-dorian-1.png","contentUrl":"https:\/\/workboot.fr\/ciela\/wp-content\/uploads\/2025\/05\/logo_ciel-dorian-1.png","width":1024,"height":950,"caption":"workboot"},"image":{"@id":"https:\/\/workboot.fr\/ciela\/#\/schema\/logo\/image\/"}}]}},"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 [&hellip;]","_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}]}}