CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Convertir un programme python en C

arkanix67
arkanix67
Niveau 8
25 septembre 2018 à 19:07:04

Yop, je voudrait convertir le programme suivant :

Prog python : https://pastebin.com/CTLax9MH
Je ne connais pas très bien le fonctionnement du python

Pour l'intant j'essaye de comprendre le fonctionnement de la fonction encrypt
Avec des tests print de variable je trouve que la première itération de la boucle for donne des valeurs incohérentes genre i qui ne commence pas a 1, c'est du à l'encodage latin-1?

Je comprend pas non plus cette ligne
result = b"\0\0\0"+ chr(len(string)).encode('latin-1')
c'est un genre de forma de chaine de caractère ?

Le return de la fonction encrypt me donne ça avec la chaine au début du programme
b'\x00\x00\x00\x1d\xd0\xf2\x81\xf8\x8b\xff\x9a\xf7\xd5\xef\x94\xb6\xd1\xb4\xc0\x9f\xec\x95\xe6\x8f\xe1\x87\xe8\xca\xf0\x8b\xf6\x8b\xf6'

Voila merci pour votre aide :ok:

stacksmashing
stacksmashing
Niveau 6
25 septembre 2018 à 19:42:34

Déja :

print(decrypt(encrypt("toto")))
«Ûoto

Je comprend pas non plus cette ligne
result = b"\0\0\0"+ chr(len(string)).encode('latin-1')

Moi non plus, parce qu'en la remplaçant par:

 result = "".encode("latin-1")

le code fonctionne :


$ python cr.py 
toto
arkanix67
arkanix67
Niveau 8
25 septembre 2018 à 19:54:21

Ça n'a pas l'air de marché pour la chaine '{"system":{"get_sysinfo":{}}}' c'est du json je croit ?
J'ai uniquement ce genre de chaine a chiffrer

Test result = "".encode('latin-1')
b'\xd0\xf2\x81\xf8\x8b\xff\x9a\xf7\xd5\xef\x94\xb6\xd1\xb4\xc0\x9f\xec\x95\xe6\x8f\xe1\x87\xe8\xca\xf0\x8b\xf6\x8b\xf6'

Test result = b"\0\0\0"+ chr(len(string)).encode('latin-1')
b'\x00\x00\x00\x1d\xd0\xf2\x81\xf8\x8b\xff\x9a\xf7\xd5\xef\x94\xb6\xd1\xb4\xc0\x9f\xec\x95\xe6\x8f\xe1\x87\xe8\xca\xf0\x8b\xf6\x8b\xf6'

J'utilise ici que la fonction encrypt

Message édité le 25 septembre 2018 à 19:55:52 par arkanix67
stacksmashing
stacksmashing
Niveau 6
25 septembre 2018 à 19:58:46

Test result = "".encode('latin-1')
b'\xd0\xf2\x81\xf8\x8b\xff\x9a\xf7\xd5\xef\x94\xb6\xd1\xb4\xc0\x9f\xec\x95\xe6\x8f\xe1\x87\xe8\xca\xf0\x8b\xf6\x8b\xf6'

Il te suffit d'utiliser decrypt() après :

print(decrypt(b'\xd0\xf2\x81\xf8\x8b\xff\x9a\xf7\xd5\xef\x94\xb6\xd1\xb4\xc0\x9f\xec\x95\xe6\x8f\xe1\x87\xe8\xca\xf0\x8b\xf6\x8b\xf6'))
{"system":{"get_sysinfo":{}}}
arkanix67
arkanix67
Niveau 8
25 septembre 2018 à 20:00:54

Oui mais mon but c'est de parvenir au même résulat avec une fonction en C et si je comprend même pas la ligne
result = b"\0\0\0"+ chr(len(string)).encode('latin-1')
je vois pas comment je vais la reproduire

stacksmashing
stacksmashing
Niveau 6
25 septembre 2018 à 20:11:55

t'en occupe pas pour l'instant, les codes ascii doivent correspondre à ceux latin-1 :(

ça donnerait :
result[0] = strlen(tachaine) /* /!\ ça dépend de comment tu as déclaré result, c'est l'une des solutions possibles */

Message édité le 25 septembre 2018 à 20:12:22 par stacksmashing
arkanix67
arkanix67
Niveau 8
25 septembre 2018 à 20:54:00

Ça donne pas la même chose pourtant pour result = b"\0\0\0"+ chr(len(string)).encode('latin-1')
b"\0\0\0" c'est le début de la chaine chiffrer et
chr(len(string)).encode('latin-1') c'est la longeur de la chaine convertie en caractère du code ascii puis encoder en latin-1

Kukur
Kukur
Niveau 9
26 septembre 2018 à 00:09:10

En fait c’est simple result = b"\0\0\0"+ chr(len(string)).encode('latin-1')

Comme tu l’as dit ça correspond à la longueur de ta chaîne ascii encodée en Latin-1 avec 3 bytes à zéro au début du tableau.

Donc si tu veux le refaire en c, il va te falloir convertir toi-même l’ascii (1 byte) en latin-1(4 bytes). Ou chaques bytes vont etres converties en une suite de nombre compris entre 1 et 4 bytes avec un alignement de 4 bytes.
Regarde ce qu’est le type wchar_t en c et aussi sur la façon de convertir en latin-1 https://fr.m.wikipedia.org/wiki/ISO/CEI_8859-1

Siikebahce
Siikebahce
Niveau 9
26 septembre 2018 à 00:09:17

Bonjour
Quelqu'un peut m'aider a mettre cet algorithme sur algobox svp je n'y arrive pas :(
]

passwordCorrect <- false;
i <- 0;
tant que ( i < [nombre maximum d'essais] et not passwordCorrect)
lire password
if (password = 1234)
passwordCorrect <- true
endif
i <- i+1
fin tant que
if (passwordCorrect)
afficher(mot de passe correct)
else
afficher(trop d'erreurs

arkanix67
arkanix67
Niveau 8
29 septembre 2018 à 21:28:58

J'avance doucement dans mon programme mais la je bloque, j'ai réussi à faire l'encodage mais maintenant il faut convertir les nombres décimaux en hexadécimal et leur rajouté \x devant.

Vu que il y a plusieurs valeurs vaut mieux prendre en entré de la fonction un tableau de int et sortir un autre tableau de char ou 4 case sera égal a \ x d 0 par exemple, puis aligné tout les caractères et finir par '\0' pour constituer une chaine facilement envoyable
Il ne faut pas non plus oublier le \x00\x00\x00 du début

Quelqu'un connais une bibliothèque qui permettrait de faire la conversion facilement ?
Et ne pas récupérer un tableau a l’envers comme dans toutes les fonctions sur internet

stacksmashing
stacksmashing
Niveau 6
02 octobre 2018 à 13:55:54

Tu peux faire les conversions string/decimal/hexa si ça te plait, mais tu peux t'en passer. Pour l'affichage il te suffit d'afficher la valeur sous forme de nombre hexadécimal de chaque case de ton tableau :

#include <stdio.h>

int main(void){

char tab[5]= "hello";
int i = 0;

for(i=0;i<5;i++){
	printf("\\x%x",tab[i]);
}

return 0 ;
}

ce qui donne :

$ ./ctest 
\x68\x65\x6c\x6c\x6f

Et pour lire une chaîne tu fais l'opération inverse avec le scanf :

#include <stdio.h>
#include <stdlib.h>

int main(void){

int tab[5]={0};
int i = 0;

for(i=0;i<4;i++){
	scanf("\\x%x",&tab[i]);
	printf("lu : %u\n", tab[i]);
}

return 0 ;
}
$ ./rtet <<< "\\x12\\x45\\x12"
lu : 18
lu : 69
lu : 18
lu : 0
arkanix67
arkanix67
Niveau 8
03 octobre 2018 à 00:16:14

Oui je peut changer l'affichage en modifiant le flag mais je sais pas si dans mon cas ou je doit envoyer cette chaine à un appareil avec des sockets il la recevra en hexa

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment