IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Traduction code C [WD19]


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut Traduction code C
    Bonjour à tous,

    N'ayant pas beaucoup de connaissances en C, je me tourne vers vous pour m'aider à traduire ce code en WLanguage :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <stdint.h>
     
    void encrypt (uint32_t* v, uint32_t* k)
    {
    	uint32_t v0=v[0], v1=v[1], sum=0, i;		/* set up */
    	uint32_t delta=0x9e3779b9;			/* a key schedule constant */
    	uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];	/* cache key */
    	for (i=0; i < 32; i++) {			/* basic cycle start */
    		sum += delta;
    		v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
    		v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    	}						/* end cycle */
    	v[0]=v0; v[1]=v1;
    }
     
    uint64_t getresponse(uint64_t challenge)
    {
    	uint32_t k[4] = {0x255edaab,0x4317e813,0x09d1bf66,0xa59409a0}
    	uint32_t v[2];
    	uint64_t response;
     
    	v[0] = challenge >> 32;
    	v[1] = challenge & 0xFFFFFFFF;
    	encrypt( v, k );
    	response = v[0];
    	response <<= 32;
    	response |= v[1];
     
    	return response;
    }

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Pas rigolo su tout ton truc. Quelques pistes :
    Pour le uint32, c'est de l'entier sans signe sur 32 bits. Pas sûr que ce soit du C "officiel". Peut-être y'a-t'il une déclaration de type ailleurs...
    les chevrons >> c'est le décalage à droite et bien sûr les chevrons << c'est le décalage à gauche.
    Les uint32_t, c'est pour déclarer les tab (précisés par l'étoile).
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut
    Non comme tu dis pas rigolo

    J'essaye de mon côté mais sans grand succès pour le moment

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Pour les opérateur, j'ai trouvé ce site : http://www.tutorialspoint.com/cprogr..._operators.htm
    Tu vas galérer pour le dimensionnement des tableaux. En C, le tableau est un pointeur du type spécifié. Dans le code, t est un tableau de unsigned int32... Pas forcément la peine de donner une dimension (et on s'étonne des bugs...)
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Bonsoir,

    Je ne vois pas où est la difficulté si on comprend le C.

    On pourrait simplifier/améliorer le code, mais traduit littéralement ça devrait donner ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    PROCEDURE gEncrypt(tabV est tableau de 2 entiers sans signe, tabK est tableau de 4 entiers sans signe)
    nV0 est entier sans signe = tabV[1]
    nV1 est entier sans signe = tabV[2]
    nSum est entier sans signe = 0
    nDelta est entier sans signe = 0x9E3779B9
    nK0 est entier sans signe = tabK[1]
    nK1 est entier sans signe = tabK[2]
    nK2 est entier sans signe = tabK[3]
    nK3 est entier sans signe = tabK[4]
     
    POUR i = 0 A 31
    	nSum += nDelta
    	nV0 += ((nV1 bitDécaleGauche 4) + nK0) || (nV1 + nSum) || ((nV1 bitDécaleDroite 5) + nK1)
    	nV1 += ((nV0 bitDécaleGauche 4) + nK2) || (nV0 + nSum) || ((nV0 bitDécaleDroite 5) + nK3)
    FIN
    tabV[1] = nV0
    tabV[2] = nV1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PROCEDURE gGetResponse(LOCAL nChallenge est entier sans signe sur 8) : entier sans signe sur 8
    tabK est tableau de 4 entiers sans signe = [ 0x255EDAAB, 0x4317E813, 0x09D1BF66, 0xA59409A0 ]
    tabV est tableau de 2 entiers sans signe
    nResponse est entier sans signe sur 8
     
    tabV[1] = nChallenge bitDécaleDroite 32
    tabV[2] = nChallenge & 0xFFFFFFFF
    gEncrypt(tabV, tabK)
    nResponse = tabV[1]
    nResponse = nResponse bitDécaleGauche 32
    nResponse = nResponse | tabV[2]
    RENVOYER nResponse

  6. #6
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bravo Hibernatus. Je comprends le C, mais je ne pratique plus assez pour les opérateurs binaires.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    Alors déjà merci de vous intéresser à mon cas

    J'ai testé le code d'Hibernatus mais sans succès.
    Pour aider, voici le contexte d'utilisation :

    Je dois déverrouiller les fonctions avancées d'un décodeur de comptage MyLaps, pour lequel je détient bien sûr des clés personnelles de type Vendor Key (exemple :0xDEADBEEF, 0x12345678, 0x9ABCDEF0, 0xDEADBEEF) et Vendor ID(exemple : 99)
    Pour débloquer les fonctions, je récupère d'abord un "Challenge" en Hexa (exemple : 288B105C0A42A586) du décodeur.
    Je dois ensuite crypter ce challenge en utilisant le bout de code C fourni par MyLaps, avec la Vendor Key, et renvoyer le tout en Hexadécimal au décodeur, accompagné de mon Vendor ID.
    Pour le format des commandes envoyées au décodeur, aucun soucis, les autres commandes ne nécessitant pas de déverrouillage fonctionnent parfaitement. le soucis semble être au niveau cryptage, mais je ne trouve pas.

    J'attends une réponse des techniciens MyLaps avec un exemple de challenge crypté afin de tester...

    Voilà, si ça peut aider à résoudre mon problème, merci d'avance.

  8. #8
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    J'ai testé le code WD et il fonctionne exactement comme le code C.
    Votre problème est donc dans les entrées/sorties.

    Par exemple, si vous récupérez un challenge en "hexa", je suppose que ça signifie que vous récupérez une chaîne, et que vous devez la convertir en entier avec HexaVersEntier.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut
    Je ne mets pas en doute votre traduction, bien au contraire

    Oui, je fais bien HexaVersEntier(ChallengeHexa).

    Voici le code que j'utilise pour préparer la chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nEncryptChallenge est entier sans signe sur 8
    nEncryptChallenge = gGetResponse(nChallenge)
    sStr est chaîne = "8E021B00000000001C000208" + Complète(EntierVersHexa(nEncryptChallenge),16,"0") + "0304" + Complète(EntierVersHexa(VendorID),8,"0") + "8F"
    L'enregistrement qui contient le Challenge encrypté doit être envoyé sous 8 bytes, le Vendor ID sous 4 bytes.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 75
    Points
    75
    Par défaut
    J'ai trouvé !!!!

    En fait il fallait inverser la chaine Hexa que l'on renvoie !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sStr est chaîne = "8E021B00000000001C000208" + Complète(InverseHex(EntierVersHexa(nEncryptChallenge)),16,"0") + "0304" + Complète(EntierVersHexa(VendorID),8,"0") + "8F"
    Merci beaucoup Hibernatus !! Vous m'avez vraiment rendu un grand service qui débloque beaucoup de choses !

    J'espère pouvoir vous rendre un jour la pareille

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traduction code VB recordset
    Par benbrisefer dans le forum Débutez
    Réponses: 3
    Dernier message: 26/03/2009, 16h25
  2. Traduction code formatage
    Par vlo59 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 20/08/2008, 17h06
  3. Traduction : code métier
    Par nicorama dans le forum La taverne du Club : Humour et divers
    Réponses: 8
    Dernier message: 29/05/2008, 10h58
  4. aide traduction code javascript
    Par calitom dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 10/10/2007, 20h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo