RSA CRYPTO EN C POUR GCC LINUX

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 16 avril 2004 à 13:59
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 19 juil. 2004 à 20:20
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/22003-rsa-crypto-en-c-pour-gcc-linux

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
19 juil. 2004 à 20:20
Pour la version suivante de ce programme, cherchez sur http://coucou747.hopto.org
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 juil. 2004 à 14:45
eh, il y avait bcp plus de commentaires ici !!!
On avait notament parlé d'une librairie permettant de crypter en rsa avec des nombres énormes, on avait parlé des algorythmes de cryptographie, asymétriques et symétriques, ect...
J'ai toujours mon problème en C pur, j'arive pas a faire la surchage d'opérateurs, et la division, je ne vois toujours pas
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
23 avril 2004 à 22:32
je penses que pour crypter, il faut commencer par le rsa et finnir par un enigma (voir l'une de mes deux autres sources), pour casser enigma, on teste toutes les solutions, et on regarde si c'est du français... si c'est codé, alors on ne peut pas savoir...
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
23 avril 2004 à 20:13
Je vois pas du tout pq ça serait plus aléatoire O_o aucune raison à cela selon moi. J'ai vu aussi, sur un autre site, la solution que tu avances, et ils semblent dire, aux aussi, que c'est plus économique. Ils écrivent aussi RAND_MAX+1.0. Semble donc juste.
patriarch24 Messages postés 25 Date d'inscription samedi 12 avril 2003 Statut Membre Dernière intervention 28 mars 2006
23 avril 2004 à 12:43
ceci est ce qui est donné par le manuel dutilisation je ne pretends pas que c'est plus rapide mais plus aleatoire. Quant a l'operation % elle est de toute facon deconseillée car agissant sur les bits de poids faible... mais bon apres moi je juge pas ca vous pouvez faire comme vous voulez pour implementer votre programme, il ne sera surement pas destiné a encoder les messages secrets du FBI :) alors...
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
21 avril 2004 à 14:17
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

Cette operation est beaucoup plus couteuse en temps de calcul que (rand() %10). Et oui celle que tu conseille travaille sur des flottants, ce qui est _long_. En plus il faut 1 multipliacation, 1 division et 1 addition... Au niveau rapidite c est une horreur (je vais faire un petit programme pour comparer).

Sinon pour avoir des nombres aleatoires "solides", voir /dev/urandom sous Linux et presque tous les autres Unix...
patriarch24 Messages postés 25 Date d'inscription samedi 12 avril 2003 Statut Membre Dernière intervention 28 mars 2006
21 avril 2004 à 12:55
a priori c du sur par contre on peut objecter la presence du +1.0 apres le RAND_MAX (vois pas dou ca sort...)
bref a mediter jai bien dit... ceci dit c'est la bonne methode a utiliser, mais pour etre vraiment sur d'avoir un tirage aleatoire, il faut utiliser des algorithmes de generation de nombres pseudo-aleatoires plus compliqués que rand(), qui est il faut le dire quand meme, "assez" previsible. J n'ai pas d'exemple a donner sous la main, mais en cherchant sur le net nul doute que vous trouverez votre bonheur.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
20 avril 2004 à 17:59
y aura pas de problème avec ta méthode, vu que le spectre des float n'est pas totalement couvert, il pourrait y avoir des nombres impossibles à sortir! c du sûr?
patriarch24 Messages postés 25 Date d'inscription samedi 12 avril 2003 Statut Membre Dernière intervention 28 mars 2006
20 avril 2004 à 12:50
rand()%RAND_MAX;
a noter que ceci est une horreur et n'est pas une bonne facon de faire : l'operation % est d'une part une opertation couteuse en temps de calcul. Et il me semble aussi qu'elle agit sur les bits de poids faible pas aussi imprevisibles que les bits de poids fort.
A faire donc : (exemple)

Si vous désirez engendrer un entier aléatoire entre 1 et 10, vous devez toujours procéder en utilisant les bits de poids forts, comme dans :

j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

et jamais ainsi :

j=1+(rand() % 10);
(extrait du manuel man sous linux)
a méditer donc.

Pour l histoire des tres grand nombres il existe des algorithmes efficaces (lancer lami google pour lui demander) de multiplication de grands entiers, et de tests de primalité.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
18 avril 2004 à 20:30
pê mais le résultat obtenu est directement le nombre désiré, et pas un tableau. remarque, évidemment pr traiter des grands nombres c'est un tableau qu'il faut, alors évidemment ... faut voir l'usage quoi ^^
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
18 avril 2004 à 20:29
Ba oui mais je pense que la meilleure solution est entres vos 2 solutions... Si le but est d obtenir un nombre grand "mais pas trop", c est a dire qui tient dans un int, l addition me semble mieux (ca donne des nombres exploitables directement), et pour des TRES grands nombres la meilleure solution est sans doute l autre...

Sinon je connais une routine pour generer des nombres pseudo-aleatoires, quand je la retrouve je la poste!!!
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 avril 2004 à 19:53
avec un truc de ce style, tu ne rajoute pas beaucoups de chiffres...
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
18 avril 2004 à 01:31
Je pense à un autre truc en fait, il suffit d'additioner plusieurs nb...

unsigned long int n = ...;
unsigned long int hasard = 0;
for(int i = 0; i + RAND_MAX < n; i+=RAND_MAX)
hasard += rand()%RAND_MAX;
hasard += rand() % (n % RAND_MAX);

comme ça on s'en sort.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 avril 2004 à 00:10
on fait
int i=0;
int nombre[100000]
nombre[0]=9999
while (i<100000){
i++
nombre[100000]=un nombre aléatoire entr 0 et 9 compris
}
et de cette façon, nombre[0] est le nombre de chiffre du nombre, nombre[1] le chiffre des unitées, nombre[2] le chiffre des dizaines...
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 avril 2004 à 23:49
on fait
int i=0;
int nombre[100000]
nombre[0]=9999
while (i<100000){
i++
nombre[100000]=un nombre aléatoire entr 0 et 9 compris
}
et de cette façon, nombre[0] est le nombre de chiffre du nombre, nombre[1] le chiffre des unitées, nombre[2] le chiffre des dizaines...
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
17 avril 2004 à 22:02
MetalDwarf a dit:
"par contre rand() te donne un nombre entre 0 et RAND_MAX donc si tu veux un nombre entre 0 et n il faut faire (rand() % n). Voila!!"

Y a un problème avec ça, c'est qu'en général RAND_MAX vaut 32767, et donc tu ne peux pas générer de nombre au hasard au delà de cette limite, et en RSA on traîte des grands nombres. Multiplier le résultat par une constante n'est évidemment pas une solution, puisqu'on obiendrait alors une plage de valeurs discrète, et donc un hasard trompé. Comment on fait si on a besoin d'un nombre au hasard entre 0 et n, avec n un réel positif non limité? je sais bien qu'il n'y a pas de hasard en informatique, mais il y a sûrement une routine qui le simule.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 avril 2004 à 17:47
Je vous remercie tous pour vos conseils.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 avril 2004 à 14:58
je voulais surtout utiliser, expérimenter, avant de faire meux ou de passer à autre chose... Je ne me servirais pas de ce système, j'ai créé plein de jeux, mais je n'ai pas joué avec vraiment. Si qqn sait comment je pourrais utiliser des nombres énormes, alors je uis prenneur...
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
17 avril 2004 à 14:12
ha et pour le théoreme de fermat, il dit ke pour tout entier p premier, pour tout entier n non multiple de p, et ben p est un diviseur de n^p - n (essayez avec p = 7, n = 4 il se trouve k'effectivement 7 divise 4^7 - 4 (16380 = 7.2340)).
rsa utilise une version presque identique, qui dit que si un entier n = p1.p2 (p1 et p2 etant premiers), et bien tout entier e < n (ou bien e non multiple de n...) vérfie la propriété : n est un diviseur de e^((p1-1)(p2-1))-1
il s'agit 'presque' de la généralisation d'euler du théoreme de fermat, sauf ke e et n n'ont pas besoin d'etre premiers entre eux.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
17 avril 2004 à 14:04
au fait dites vous bien k'un rsa 48 bits avec les ordinateurs actuels, c'est comme une serrure en papier... si vous voulez protegez kelke chose d'important, ca se casse tellement vite, ke 48 bits c'est evidemment pas assez
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
17 avril 2004 à 13:27
Suis en seconde aussi, et je ne le comprends pas non plus, mais me disais que pr qq un qui code un algo RSA ça doit être possible, non?
Enfin, tu feras sans alors, mais je vois pas comment tu peux t'en tirer... si j'en crois les différents textes à ce sujet sur internet, c'est le moyen le plus efficace.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 avril 2004 à 13:22
chercher à comprendre fermat, merci, je suis en seconde...
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
17 avril 2004 à 13:14
Pour %, il y a des théorèmes qui permettent d'aléger les calculs. Je pense que c'est Fermat qui les a rédigé, donc cherchez de ce côté là ;-)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 avril 2004 à 12:16
c'est la seule solution pour / et %, mais pour * il en existe une autre, mais le nombre dépassera 128 (or que le - soit possible, la variable devra être définie de -127 +128)...
le return, je penses pouvir régler le problème avec ta solution, merci.
pour le nombre premier, je ne connais pas la formule ou l'algorythme de test (sauf celui du programme qui est beaucoupzs trop long)... Je suis allé sur plein de sites, mais ils n'expliquent rien...
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
17 avril 2004 à 11:57
Hé hé... Ma calculatrice n est ni plus ni moins performante que la TI-92+, elle a exactement les memes fonctions (comme la V200 d ailleurs), sauf que comme elle est sortie bien apres, elle est bien plus petite (elle ressemble aux autres TI). Si tu veux plus de precisions regarde sur le site de TI.
Pour obtenir un nombre aleatoire, et si la meilleure solution c etait rand(). Mais attention il faut initialiser le generateur aleatoire avec srand().
Le plus courant est de faire :

#include <time.h> // pour time()

/* ... */
srand(time(NULL));

par contre rand() te donne un nombre entre 0 et RAND_MAX donc si tu veux un nombre entre 0 et n il faut faire (rand() % n). Voila!!

Non tu ne peux pas faire ce que tu dis pour %, * et /. Parce que si tu dois prendre le modulo d un nombre tres grand, ton programme va etre incroyablement lent (il ne pourra sans doute meme pas finir en 10 ans de calcul sur le meilleur P4...). Pareil pour *. Imagine que tui dois calculer le produit de 2 nombres de 100 chiffres...bon courage avec ta methode...
Non il faut tout reprendre comme au primaire pour * et /, et pour % je ne sais pas :-(
Et puis meme si tu programme ces fonctions il te faudra d autres algorithmes comme l exponentiation modulaire rapide, pour calculer rapidement (a^b) % n,...

Je ne comprend paas tres bien tn probleme de return... return marche sur un tableau!! il renvoie un pointeur sur celui-ci, mais si ton tableau est local a la fonction, c est la que tu vas faire un SEGFAULT...
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 avril 2004 à 11:47
justement, c'est comment obtennir un nombre aléatoire?
ma calculatrice, c'est une ti83+ silver éditoin... 1mo5 de mémoire...
et ta calto n'est surement pas plus performante que la ti92+... je sais qu'il y en a d'autres, mais à 2* plus cher...
Pour ma librairie, c'est facile, que ce soit /*-+ ou encore %
pour le %, il suffit de faire - jusqu'a ce que le nombre soit plus petit...
idem pour le / mais en comptant combien de fois on peut faire -
pour * c'est un peu plus compliqué, car les nombres ne doivent pas prendre plus d'un octet, sinon, je vais faire une erreur de mémoire (ségmentation fault)... je dois donc aussi faire une fonction qui si le chiffre est + grand que la base, alors on baisse le nombre de la base pour ajouter 1 au nombre suivant...
ce qui me pose problème, c'est a la sortie de toutes ces fonctions, comment main pourra t'elle recevoir l'argument... Le return fonctionnerais pour un nombre, mais pas pour autant...
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
17 avril 2004 à 11:31
Ou la ca fait beaucoup de questions tout ca!!!
Deja regarde bien ta calculatrice, ca doit etre un TI-83+, a moins que TI ai sorti un produit secret sans me le dire...
La TI-89 c est la meillleure calculatrice de TI, avec le calcul formel et le support des nombres jusqu a plusieurs centaines de chiffres (450! ca passe dessus!!!). Donc ce n est pas un programme, mais deja inclu dans la calculatrice.
gcc pour windows, j ai jamais essaye... je me souviens simplement avoir porte un programme sous Dev-C++ pour mo TPE l an dernier.
Pour utiliser des grands nombres, ils y a plusieurs voies :
- celle de la facilite : utiliser NTL qui est un librairies qui fait ca tte seule comme une grande et qui est en C++.
- la vraie voie, qui est de tout faire soit-meme, c est a dire ecrire une classe (ou un ensemble de fonctions) qui permettent de faire des operations sur des grands entiers. La methode est celle que tu as decrite : stocker dans un tableau, et faire les operations comme au primaire (pour +, - et x ca passe, mais beaucoup moins bien pour /...).

Apres pour creer un nombre premier enorme, on n est pas sur qu il soit premier, mais presque sur!!! En fait on genere un nombre tres grand aleatoirement et on teste si il a des chances d etre premier (algorithme de Miller-Rabin, qui donne la probabilite qu un nombre soit premier tres vite par rapport a un vrai test), et on recommence jusuq a ce que le nombre passe le test....
Pour que le nombre soit aleatoire, il suffit de remplir chque case memoire (chaque chiffre) avec un nombre aleatoire!
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 avril 2004 à 11:20
HEMHEM... J'ai que 15 ans, le méchant windows qui torture le mimi linux, c'est des histoires interdites aux -18...
Bref, j'y comprends rien...
J'avais trouvé gcc pour windows, mais le problème c'est que pour l'installer, il faut modifier autoexec.bat, et que sous xp, il est présent, mais on ne s'en sert pas...
Le réseau, je n'y ai pas encre touché, les graphismes non plus, je pensais à sdl pour les graphismes, mais voile, c'est compliqué...
Simple question a part : Comment votre ti89 a pu supporter un nombre de 70 bits ?!?! j'ai une ti93+se et elle refuse les nombres de plus de 10 chiffres si on ne veut pas les passer en float, et en float, ils perdent leur précision... Je serais curieux de voir le programme...
Vous parliez de routine au début, pour pouvoir utiliser des nombres de + de 48 bits, comment la feriez vous ? moi je pensais à le stoquer dans un tableau, un [0] le nombre de chiffre, en [1] le chiffre des unitées, en [2] des dizaines, et ainsi de suite... Le problème, c'est que je ne sais pas comment on peut modifier une variable au retour de fonction, et un tableau ne passe pas en teturn...
Autre problème, pour crée des clées, comment créer un nombre premier énorme ?
Autre problème Coment faire que ce nombre soit aléatoire ?
C'est pour ces quelques raisons que j'ai décidé de limiter à 48 bits...
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
17 avril 2004 à 11:05
A alors bonne chance dans ce cas... Non en fait ce n estr la plupart du temps pas si complique, le plus gros probleme etant la connerie de windows...
Comme compilateur tu peux essayer celui de microsoft, mais il va pleurer a cause de plein de choses...
En fait utilise plutot Dev-C++, qui est un portage de gcc sur windows (a ce que j ai compris) et qui possede un IDE pas mal.
Par contre pour tes sources reseau, il va falloir reecrire ca avec l API winsock, mais les differences sont mineures. La ou c est plus relou c est avec getopt() qui existe pas sous windows!!!
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 avril 2004 à 11:01
Konqueror est mieux que mozilla pour le javascript, il sait mieux se servir des

quand on veut se faire se déplacer une image... DSL mon site n'est plus en ligne, on me l'a supprimé de dyndns.org car je le remettait a jours trop souvent...
Franchement, le linux c'est super, mais j'aimerais savoir quel compilateur c est gratuit et fonctionne parfaitement sous xp, car pour mes potes, le linux c'est compliqué, et ils ne s'y metterons jamais (j'ai 15 ans, je suis en seconde, je programmais avant en qbasic quand j'étais en sixième, je suis passé au html, puis au javascipt, ensuite au tibasic puis au c, je suis entrain d'essayer le php...) Bref, je suis plus motivé que mes potes, ils ne pensent qu'a jouer, mais j'aimerais quand même leur passer mes programmes...
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
17 avril 2004 à 10:50
Ba non en fait le probleme n est pas la... Le vrai probleme c est que dans les calculs de RSA tu fais intervenir des nombres de 1024 bits au moins meme en utilisant des cles de 128...
En plus RSA n offre AUCUNE securite en dessous d un certain seuil, et tu es malheureusement en dessous de celui-ci (a titre d exemple ma TI-89 factorise en quelques secondes un nombre de 70 bits...).

Sinon pour Linux je suis tout a fait d accord!! Konqueror est pas mal, mais il ne vaut pas Mozilla.
dPompei2 Messages postés 55 Date d'inscription samedi 27 mars 2004 Statut Membre Dernière intervention 1 septembre 2006
16 avril 2004 à 20:34
Merci, c'est cool de voir que Linux attire de plus en plus de mecs.
Et merci pour ton code. J'pense aussi que 48 bits suffisent.
On ne va pas crypter des docs du FBI et MI6 etc. qui sont si secrets que qqun se ferait la peine de faire du brute force pendant des heures et des heures ...

[LinuX RuleS]
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 avril 2004 à 19:11
je sais que le rsa nessecite plusieurs centaines de chiffres pour pouvoir être incassable, mais franchement, est-ce-que vous en avez besoin ? La loie dis pas plus de 128 bits, alors moi, je limitte... (à 48)

J'utilise konqueror comme naviguateur...
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
16 avril 2004 à 18:20
Par contre, si tu pouvais reposter stp... ou alors mettre un zip.
J ai pas encore regarde ton code, mais il me parait bien leger pour du RSA complet. Ce que je veux dire par la c est que RSA pour que ca marche il faut utiliser des nombres de plusieurs centaines de chiffres, donc programmer une gestion specifique...
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
16 avril 2004 à 18:15
zarb, depuis que je code sous Linux je n ai jamais poste avec autre chose que Linux (Mozilla ou FireFox/FireBird) et je n ai jamais eu de probleme...
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 avril 2004 à 17:11
une astuce pour le lire, copiez collez dans un wordpad...
Sous linux, les retours à la lignes sont fait en un seul caractère alors que sous windows, il en faut 2, donc on ne peut pas lire ceci facilement.
Wordpad fait la convertion, mais je n'ai pas wordpad, je suis dsl pour deux qui ont la flème de copier coller dans un wordpad, mais je ne vois pas comment ils auraient fait de toute façon pour le compiler autrement.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
16 avril 2004 à 17:02
cé illisible ton truc; reposte le depuis un autre navigateur
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 avril 2004 à 13:59
DSl pour les retours a la ligne, mais il y a une différence a ce niveau la entre linux et windows donc...
Rejoignez-nous