Codes sources C++

Ajouter un nouvel élément

Les performances du mois

OpenCV
2
Nombres Premiers
1
Chiffrement RSA pour les nuls
3

ang Chiffrement RSA pour les nuls

Licence : Libre
Le principe de base de RSA est de considérer un message comme un (grand) nombre entier et de faire des calculs dessus pour le chiffrer.
Les implémentations que l'on trouve dans le monde industriel utilisent des librairies de calcul sur des entiers arbitrairement longs très optimisées et difficiles à comprendre.
Le but de ce petit programme est d'implémenter RSA sur des entiers "classiques" et sans la moindre optimisation pour mieux comprendre l'algorithme.

Pour autant, cette implémentation est parfaitement conforme à l'algorithme RSA.
Sa seule limitation est taille de la clef qui est de 31 bits au maximum.
Ce qui donne un niveau de sécurité à peu près nul (il faut au moins 512 bits pour que l'on puisse commencer à parler de sécurité).

Le type des entiers est 'big_int' qui peut être un long (32bits) ou un long long (64bits).
Mais il peut être remplacé par n'importe quel type qui supporte les opérateurs d'affectation, d'arithmétiques classiques (*+/-%) et de comparaison.

Le code est en c++ tout à fait standard, mais est livré avec un projet Visual Studio 2005.

Hadrien Flammang - dec 2008

ang OpenCV

Éditeur : Intel +
OpenCV (Open Source Computer Vision) est une bibliothèque visant principalement à la vision par ordinateur en temps réel. Elle a été initialement développé par Intel, et est maintenant soutenue par Willow Garage et Itseez. elle est gratuite pour une utilisation sous la licence open source BSD. La bibliothèque est multi-plateforme. Avec plus de 2500 algorithmes optimisés, elle comprend un ensemble complet d'algorithmes d'apprentissage classique et les dernières innovations en vision par ordinateur. Ces algorithmes peuvent être utilisés pour détecter et reconnaître des visages, identifier des objets, classer les actions humaines dans les vidéos, suivre les mouvements de caméra, suivre des objets en mouvement, extraire des modèles 3D d'objets, produire des nuages ​​de points 3D à partir de caméras stéréo, assembler des images pour produire des images haute resolution d'une scène, trouver des images similaires à partir d'une base de données d'image, supprimer les yeux rouges des images prises au flash, suivre les mouvements des yeux, reconnaître des paysages et établir des marqueurs pour superposer des réalités augmentées, etc

ang Mandelbrot

Éditeur : regis.portalez + 550 Ko
Génération de l'ensemble de mandelbrot et des ensembles de julia sur CPU & GPU
Affichage dans une fenetre utilisant la SDL.
Dependances : SDL.lib, SDLmain.lib, cudart.lib
4 modes d'affichage : gray-level, gray-level-reversed, RGB random, Green (comme le logo).
Navigation : zoom - unzoom, directionnelle, reinitialisation, augmenter resolution, diminuer resolution, retour en arriere
Pour représenter l'ensemble de julia associé à un point du plan : faire un clic du milieu.
Pour revenir au mandelbrot : clic du milieu n'importe où

Multiplateforme (Windows - Linux) [ j'ai jamais developpé sous mac, mais j'imagine que ça marche aussi ;) ]

Update : Support cuda pour le calcul. Editer le fichier params.h et mettre les valeurs correspondant à votre carte graphique
g_block_dim // g_grid_dim
PLATFORM : utiliser CUDA pour travailler sur GPU, CPU pour rester sur CPU.

Résultats obtenus sur le calcul de l'ensemble (le plot est limitant avec la SDL...) pour maxiter = 20, image 256x256

CPU : Xeon W3550 @ 3.07 GHz : 240 FPS
GPU: Geforce GT470 : 1000 FPS ( g_block_dim = 256 // g_grid_dim = 32 ) (image 1024-1024)


EDIT : projet visual c++ 2008 joint

ang Courbes elliptiques pour les nuls

Licence : Libre
Comprendre la cryptographie sur les courbes elliptiques sans (trop) entrer dans les détails théoriques.

  • Notion de base de la cryptographie avec des courbes elliptiques (elliptic curve = EC).
    On se donne une arithmétique dans laquelle on manipule des points et des entiers.
    On a une addition entre points (point + point -> point)
    On a une multiplication entre entiers et points (entier * point -> point)
    Toute la sécurité est basée sur le fait que, dans cette arithmétique :

      - connaissant un point P et un entier n, on peut facilement calculer le point nP
      - connaissant les points P et nP, il est très difficile de calculer n

    La notion de "facile/difficile" renvoie aux temps de calculs nécessaires.
  • Les courbes elliptiques
    Une courbe elliptique E est définie par une équation de la forme y² = x³ + ax² + b.
    Pour faire de la cryptographie, on se place dans le corps Z/pZ.
    La courbe E est alors définie par un triplet d'entiers ( a,b,p ) tels que
    • p premier
    • 0 < |a| < p
    • 0 < |b| < p
    • 4a³ + 27b² mod p != 0

    La courbe elliptique E est l'ensemble des paires d'entiers (x,y) tels que :
    y² mod p == ( x³ + ax² + b ) mod p

    Ensuite, on définit une addition pour les points de E.
    Attention : il ne s'agit pas d'une addition "simple" !
    Si P, Q et R sont 3 points de E tels que R = P + Q, alors on n'a pas Rx = Px + Qx et Ry = Py + Qy !
    C'est beaucoup plus compliqué : R est l'opposé du point d'intersection entre la droite PQ et E.
    beau schéma ici
    Pour plus de détails mathématiques, suivre les liens indiqués plus bas.
    Pourquoi définir une addition si compliquée ?
    Pour se donner une arithmétique satisfaisant les critères de sécurité nécessaires à la cryptographie.
    Une fois qu'on sait additionner des points sur E, on peut calculer 2P = P + P, 3P = P + 2P, nP = P + (n-1)P.
    On obtient donc une multiplication entre entiers et points de E.
    Sur une courbe elliptique on définit G, un "générateur" :
    Que quel que soit P un point de E, il existe un entier n tel que P = nG.
    Il peut exister plusieurs générateurs, mais il existe des points de E qui n'en sont pas.

  • Création des clés :
    Pour une courbe elliptique E de générateur G, on choisit un entier k.
    • la clef privée = (E,G,k)
    • la clef publique = (E,G,kG)

    Comme il est assez difficile de trouver E (i.e. a, b et p) et surtout G, on utilise des valeurs fournies
    par la littérature => Seul k reste à choisir.
    De plus, pour des raisons mathématiques qui ne seront pas développées ici, toutes les courbes elliptiques
    n'apportent pas le même niveau de sécurité.
    Pour faire de la cryptographie sûre, il est donc très important de choisir ces constantes dans la littérature.
    Elles font partie de la clef publique et peuvent donc être exposées sans perte de sécurité.
    En revanche, dans l'exemple développé ici, on s'autorise à utiliser des courbes quelconques.


  • Chiffrement/déchiffrement :
    Le message m est chiffré avec un algo symétrique et c'est la clef qui est "transmise" en utilisant une EC :
    • Chiffrement :
      On choisit un entier r dans { 1,p-1 } et on calcule S = rkG.
      A partir de S on dérive une clef de chiffrement symétrique K et on calcule m' = m chiffré par K.
      --> le message chiffré = la paire ( m' , rG )
    • Déchiffrement :
      On retrouve S = k(rG) dont on dérive K avec laquelle on déchiffre m'.



Hadrien Flammang - mai 2013

ang Nombres Premiers

Éditeur : Kakou35 + 692 octets
Vous entrez un nombre et le programme trouvera tous les nombres premiers compris entre 0 et votre nombre!

ang Un éditeur de réseau de places et transitions (RdP)

Licence : GPL
Un réseau de places et transitions est un réseau de Petri (Petri Net ou RdP) généralisé et non coloré (sans extensions).

L'application PTNET Editor permettra de dessiner/editer graphiquement un tel réseau, de l'animer, de l'analyser en construisant et visualisant son graphe de couverture/accessibilité, de le convertir en fichier image et de le sauvegarder en tant que document PNML.

1. Compiler l'application

L'application a été développée et testée sous GNU/Linux OpenSUSE 12.3 (KDE). Elle est basée sur le Framework Qt 4.8.4 et utilise aussi:
  • Boost Graph Library 1.49 (BGL) pour construire le graphe de couverture/accessibilité d'un RdP (graphgenerator.cpp)
  • la bibliothèque GraphViz 2.28 pour visualiser le graphe convenablement (graphvisualizer.cpp).

=> Vous devez installer ces bibliothèques pour compiler le code source!

Important: Pour éliminer les deux étapes suivantes (étape 2 et 3) et tester l'application directement, consultez le
fichier source tabwidget.cpp et commentez les étape [0], [1] et [2] de la méthode bool validateXml(QFile& file, MessageHandler &messageHandler). Autrement dit, modifiez cette méthode pour qu'elle retourne toujours true indiquant que le document PNML est valide.

2. PNML

PNML (Petri Net Markup Language) est un format standard d'échange des réseaux de Petri. L'application est basée sur ce standard. Vous pouvez télécharger le grammaire (spécification) de ce language ici: http://www.pnml.org/grammar.php.

Notre application est un éditeur des RdP sans extensions. Donc nous somme pas besoin de tous les fichiers de grammaire téléchargé. On va juste utiliser 4:
  • pnmlcoremodel.rng : Contient la définition de PNML Core Model.
  • ptnet.rng : Contient les déclarations des types ajoutées par les réseau de places et transitions : initialMarking (marquage initial d’une place) et inscription (poids d’un arc).
  • anyElement.xsd : Utilisé pour définir une grammaire non fournie par le standard PNML. Dans notre cas ceux sont les éléments ToolInfo.
  • conventions.rng: utilisé par ptnet.rng.

3. Convertir les fichiers RNG

Le grammaire PNML est décrit en langage RELAX NG (.rng). Celui ci est un langage de description de document XML alternative de XML Schema. RELAX NG n’est pas supporté par le module XML de la bibliothèque Qt. Donc on doit convertir les fichiers de format RNG en format XSD! A ce propos, on va utiliser l'outil Trang.

Trang est un outil libre permettant de convertir des schémas RELAX NG en XML Schema. Vous pouvez le télécharger ici:http://code.google.com/p/jing-trang/downloads/list.

Convertir les fichiers rng en des fichiers xsd ?

1. Dans le répertoire /home/~Download/Trang, créez un dossier et le nommez rng.
2. Créez un autre dossier dans le même répertoire /home/~Download/Trang et le nommez xsd.
3. Copiez les 4 fichiers rng dans le dossier rng.
4. Pour convertir les 4 fichiers, utilisez la commande : java -jar trang.jar -I rng -O xsd rng/ptnet.rng xsd/ptnet.xsd.
5. les fichiers RNG sont maintenant convertis en fichiers XSD et copiés dans le dossier xsd.

L'application va utiliser les 4 fichiers xsd pour valider un document PNML décrivant un RdP !

Donc, vous devez procéder comme suit:

6. Copier les 4 fichiers xsd dans le répertoire : ptnet/shemas
7. Modifier le fichier anyElement.xsd en supprimant la balise xs:group et en ajoutant la balise contenue dans le fichier ptnet/shemas/anyElement.txt

4. Tester l'application

Une fois l'application est compilée et les fichiers XSD sont générés (étapes 1-5) et ajoutés au répertoire /ptnet/shemas et modifiés (étapes 6-7), vous pouvez le tester en utilisant les exemples contenus dans le dossier ptnet/examples.
  • Pour changer les attributs d'une Place, Transition ou un arc faite un double-clique sur l'élément correspondant.
  • Pendant l'animation d'un RdP et pour franchir (tirer) une transition faite un clique gauche sur elle.




Bonne utilisation :)

ang [Math] Polynômes

Licence : Autre
La gestion des Polynômes et des opérations qui y sont liées est un domaine récurrent en programmation. Cette petite classe a pour but de vous faciliter la vie en gérant à votre place les polynômes.

ang [Qt 5] Les nouvelles possibilités de connexions signaux-slots dans Qt 5

Licence : Libre
Ce mini-projet Qt 5 présente les nouvelles possibilités de connexions entre signaux et slots proposées dans Qt 5 :
- les connexions avec un pointeur de fonction ;
- les connexions avec les fonctions lambdas.

Pour en savoir plus, rendez-vous sur mon blog : Les signaux et slots dans Qt5

ang Gestion horaires

Licence : Libre
#Attention, ce programme est de mauvaise facture, une version plus stable et complète arrive. ( Un upgrade du fichier save sera faite )

Stockez et visualisez simplement vos horaires de travail
(Contient l’exécutable windows et les fichiers sources multiplateforme)

Traduction :
Employer -> Agence intérim
Job -> Travail

Explication :
Une intérim est crée par défaut (Without Employer), au cas ou il y ai relation directe avec l'employeur.
Possibilité d'en rajouter.
Entrée pour différents travails.
Ajouter des dates.
Vous aurez aurez un accès simple au cumule des horaires et jours.
Ceci est sauvegardé dans un fichier save.txt qui devra et dans le même dossier que l’exécutable. (Éviter de le modifier directement)

Si des questions vous avez, vous pouvez me MP.
Bibliothèque standard

ang [Math] Résolution d'équations différentielles (Runge-Kutta)

Licence : Autre
Ce code permet de résoudre une équation différentielle du premier ordre du type : dy/dx = f(x,y) avec des conditions initiales sur y et x.

ang classe facilitant les interactions avec un port COM / RS232

Licence : Autre
Cette classe (dialogueCOM) permet de faciliter les opérations de lecteur et d'écriture sur les ports COM et RS232. Elle marche aussi bien sur linux que sur Windows. J'ai rajouté un exemple pour montrer comment elle fonctionne.

ang Class Clavier

Éditeur : ANDST 44 + 443 octets
c'est une classe pour gérer les entrée clavier, comme la classe Scanner en java, pour utiliser il suffit de met next avec int, double, float, char, ou string

Ex: nextInt("entrer un int");

ang ImageAnalyzer

Licence : Autre
But
===============
Petite application mobile et PC permettant de retrouver ses amis sur les réseaux sociaux par leur photo.

Contexte
===============
Cette application est très basique (la comparaison des photos se fait pixels par pixels)
Elle est juste faite pour montrer comment développer une application avec Ubuntu SDK
et l'installer sur le système mobile Ubuntu Touch.

Contenu
=============
Elle est développée en QML/Javascript et C++

Exécutable
=============
on a un exécutable pour Ubuntu 13.10 et deux pour le système mobile Ubuntu Touch.

ang [Math] Big Int

Licence : Autre
La valeur maximale des calculs est par défaut limitée en C++. Pour y remédier, il faut passer par des classes personnelles qui permettent une valeur maximale "infinie". Voici un exemple d'une telle classe

ang luapp

Licence : LGPL
Voilà plusieurs années que je programme différents projets dans lesquels j'ai besoin d'un langage de script. Après quelques recherches, mon choix c'est tourné vers Lua, principalement pour sa syntaxe proche de celle du C++ et pour sa simplicité.

Le seul soucis, c'est que Lua a été programmé en C. Autant la syntaxe du langage est simple, autant son interface en C est relativement pénible à utiliser, même si je doute que l'on puisse faire beaucoup mieux.
J'ai donc pris le temps d'écrire un wrapper en C++ dont le but est d'encapsuler tous les appels de fonctions C de Lua et qui tire profit des capacités du C++. Pour le moment, seule une partie des fonctions de la bibliothèque originale sont supportées, mais je n'ai pas encore éprouvé le besoin d'utiliser les autres. De plus, il reste possible à tout moment de récupérer un pointeur vers la lua_State sous-jacente et d'utiliser comme on le souhaite les fonctions C dessus. En bref : que du bonus. Les sources ci-dessous contiennent donc une classe "centrale", qui wrappe le pointeur vers la lua_State. Elle est sobrement nommée "lua::state".

Mais ce n'est pas tout ! On a très souvent besoin d'ajouter des fonctions supplémentaires au langage Lua, qui font appel à des fonctions du programme qu'on développe. On appelle ça des "glues". Le principe est assez simple (les arguments de la fonction sont déposés en haut du stack Lua, on les lit, puis on pousse les valeurs de retour sur le stack, que Lua gère ensuite), mais est très sujet aux erreurs. En particulier, le gestion des types d'entrée peut être pénible. J'ai donc également programmé une classe utilitaire nommée "lua::function" qui se charge de tout : vérification des types en entrée, gestion des valeurs de retour, etc. La syntaxe est je pense assez simple (voir ici pour un exemple).

Le tout vient avec un type variant "lua::var" qui permet de stoker dans une même variable C++ un objet de type nombre, string, booléen, ou autre, ce qui simplifie grandement la vie dans certains cas (le code est inspiré de la classe "variant" présentée sur ce site !). Les deux autres classes supportent ce type nativement.

Pour finir, j'ai aussi inclus un petit bout de code qui n'est pas de moi, nommé "Lunar", qui permet de gérer des classes en parallèle entre Lua et C++ de manière assez simple. Je n'ai pas trouvé de version mise à jour, et je n'ai pas les connaissances nécessaires en Lua pour l'upgrader. À noter donc : tout le code est compatible avec Lua 5.1.4, mais par la 5.2 !

Voilà pour la présentation, je pense n'avoir rien oublié.
Dans la version pré-compilée, vous trouverez un dossier "doc" avec la documention doxygen pré-générée. Les commentaires sont de toute façon toujours dans les sources, donc vous pouvez la générer vous même si vous le souhaitez.
Le tout se compile en principe sans problème avec MinGW sous Windows ou avec g++ sous Linux, en activant le support du C++11 (nécessite gcc 4.5 au minimum). Les projets de compilation sont fournis pour Code::Blocks et VC++ 2010. La bibliothèque "luapp" se base sur une petite bibliothèque utilitaire "utils" qu'il faudra aussi compiler (elle propose un pointeur à compteur de référence et son weak pointer associé, quelques fonctions raccourcis pour la gestion des fichiers et des chaînes de caractères).
C'est open source et libre, distribué sous licence GNU LGPL.
J'espère que ça pourra servir à d'autres !

Normalement, le tout est bien rôdé puisque je m'en sers depuis longtemps.
N'hésitez pas à intervenir sur le forum si vous avez des soucis ou si certains points ne sont pas clairs.

ang BrainBackup.exe

Licence : Autre
BrainBackup.exe + Dll Tools.dll et Tools.lib
BrainBackup_HLP_FR.HLP et BrainBackup_HLP_US_HLP
Ce logiciel installe un programme de sauvegardes avec son help. Il peut être exécuté avec la langue française ou Anglaise (unicode)

ang [Designs pattern] : Observateur

Licence : Autre
Voici une implémentation du design pattern observateur basée le polymorphisme.

ang Algorithme A*

Licence : Gratuit
Voici un exemple d'implémentation de l'algorithme A* réalisé par khayyam dans son article Recherche de chemin par l'algorithme A*

ang [Conteneur] Tableau à 2 dimensions

Licence : Autre
Cette classe permet d'émuler un tableau de n lignes * m colonnes en utilisant le fait qu'accéder à l'élément situé ligne i, colone j revient à accéder à l'élément numéro i*n+j d'un tableau à une dimension de longeur m*n.

ang OpenGL et Gtkmm – douzième partie

Licence : Libre
Conversion du douzième tutoriel OpenGL NeHe utilisant Gtkmm et GtkGlExtmm. La construction est gérée par CMake, le fichier « LISEZMOI.txt » donne la procédure de compilation, qui est très simple et standard : lancez CMake, puis faite la compilation à partir de votre environnement de programmation de manière classique.

75 éléments

 
 
 
 
Partenaires

PlanetHoster
Ikoula