Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Bug, un caractère en trop dans mon paquet pour les packets perso.  (Lu 21412 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #15 le: Juin 24, 2013, 04:17:05 pm »
Bon, je suis obligé de réinterpréter le pointeurs sur void* en char* car les opérations mathématiques ne marchent pas sur les pointeurs de void* et puis des données, pas des adresses que je veux chiffrer.

Pour me simplifier la vie je mets tout dans un string car je rajoute des octets au début du paquet avant de l'envoyer, c'est plus facile de faire ça avec un string qu'avec un tableau.

const char* datas = static_cast<const char*> (getData());
    buffer.assign(datas, datas + getDataSize());
    string message="";
    vector<char>::iterator it;

    for (it = buffer.begin(); it != buffer.end(); it++)
         message += *it;

    string cryptedMessage = SymEnc::encrypt(message);

    buffer.clear();
    for (unsigned int i = 0; i < cryptedMessage.size(); i++)
        buffer.push_back(cryptedMessage.at(i));
    dataSize = buffer.size();
    return &buffer[0];
 

Malheureusement , ne marche pas toujours, parfois mon paquet reçois des données invalides. :/

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #16 le: Juin 24, 2013, 06:25:40 pm »
Bon le problème doit venir de mon code alors, car, ça marche très bien quand j'envoie des messages serveur/client pour déplacer le personnage, mais quand je commence à lui envoyer des messages avec l'IA pour attaquer, c'est à ce moment là que par moment ça freeze car mon client ne reçoit pas un message..., ça ne me le fait pas tout le temps mais, assez souvent. :/

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #17 le: Juin 24, 2013, 09:03:57 pm »
Déjà je pense que ton code peut être grandement simplifié :

string cryptedMessage = SymEnc::encrypt(std::string(getData(), getData() + getDataSize()));
buffer.assign(cryptedMessage.begin(), cryptedMessage.end());

dataSize = buffer.size();
return &buffer[0];

Et je comprends pas ces conversions inutiles vector <-> string. Le vector<char> est le plus idiomatique pour traiter un tableau d'octets. std::string c'est pour des chaînes de caractères.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #18 le: Juin 25, 2013, 08:22:12 am »
Oui je vais simplifier le code déjà, les vector de char j'y ai pensé mais je préfère les string, de toute façon les string ce sont des vector de char et c'est plus simple pour insérer des caractères en début de chaine pour le chiffrage, car il y a des méthode comme la méthode insert dans la classe string qui existent déja hors qu'avec un vector t'es obligé de le faire toi même, car y'a que le push_back.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #19 le: Juin 25, 2013, 08:45:40 am »
Bon j'ai déjà simplifier le code, mais ça ne résoud pas le problème que j'ai.
const void* SymEncPacket::onSend (size_t& dataSize) {
    string cryptedMessage = SymEnc::encrypt(std::string(static_cast<const char*> (getData()), getDataSize()));
    buffer.assign(cryptedMessage.begin(), cryptedMessage.end());
    dataSize = buffer.size();
    return &buffer[0];
}
void SymEncPacket::onReceive (const void* data, size_t dataSize) {
    string message = SymEnc::decrypt(std::string(static_cast<const char*> (data), dataSize));
    buffer.assign(message.begin(), message.end());
    append(&buffer[0], buffer.size());
}
 
Je me retrouve toujours avec un paquet vide et une erreur de temps en temps quand le serveur envoie un paquet en TCP au client.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #20 le: Juin 25, 2013, 09:13:04 am »
Citer
Oui je vais simplifier le code déjà, les vector de char j'y ai pensé mais je préfère les string, de toute façon les string ce sont des vector de char et c'est plus simple pour insérer des caractères en début de chaine pour le chiffrage, car il y a des méthode comme la méthode insert dans la classe string qui existent déja hors qu'avec un vector t'es obligé de le faire toi même, car y'a que le push_back.
std::vector possède aussi une fonction insert, comme tous les conteneurs standards.

Citer
std::string(static_cast<const char*> (getData()), getDataSize())
Comme je te l'ai dit, il ne faut pas interpréter les données comme une chaîne de caractère. Là tu utilises le constructeur qui prend une chaîne C (terminée par zéro). Or il peut très bien y avoir un zéro à n'importe quel endroit du paquet.

Il faut utiliser le constructeur qui prend deux itérateurs :

const char* data = static_cast<const char*>(getData());
std::string s(data, data + getDataSize());
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #21 le: Juin 25, 2013, 10:14:06 am »
Ok, je vais tester avec un vector pour voir ce que ça donne.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #22 le: Juin 25, 2013, 11:30:30 am »
Mais je serai toujours obligé de travailler à un moment avec des string que je devrai ajouter dans le nouveau vecteur d'octet, car, gmp travaille avec des string pour la gestion des grand nombres.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #23 le: Juin 25, 2013, 12:04:10 pm »
A moins que gmp permette aussi de travailler directement avec des octets. (c'est à dire des vector de char au lieu des fameux set_str et get_str.)
Je ne connais pas encore très bien gmp..., j'ai juste pris un code que j'ai trouvé sur un forum à l'époque pour généré mes grands nombres et chiffrer.
« Modifié: Juin 25, 2013, 12:06:23 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #24 le: Juin 25, 2013, 01:24:41 pm »
Ca n'a rien à voir, GMP prend des chaînes représentant des nombres (par exemple "126567983121"), pas des tableaux d'octets quelconques.

D'ailleurs tu fais quoi avec GMP dans ce contexte ? Et tu utilises quel algorithme de chiffrement ?

Tu n'utilises pas une bibliothèque de crypto qui te fait tout le boulot ?
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #25 le: Juin 25, 2013, 02:02:42 pm »
Non je n'utilises pas une bibliothèque de crypto qui fait tout le boulot, j'utilise un chiffrement hétérogène, (1 er chiffrement : chiffrement rsa, second chiffrement : chiffrement symétrique à l'aide d'une bête fonction.)

Mais bon j'ai réfléchi un peu et j'ai trouvé pourquoi ça crashais parfois, en fait, j'ai oublié de faire une chose dans mon moteur réseau.
J'utilise plusieurs thread pour envoyer et recevoir des paquets.
La programmation multi-thread  à de nombreux avantages mais en contre partie c'est plus dur pour débuguer.

Etant donné que j'ai fait un thread qui lis les données et un autre thread qui les envoyaient, il arrivait parfois que mon programme recevait et envoyait des données en même temps, j'ai donc rajouté un mutex autour des fonction send et receive de mes sockets et là ça va ça ne plante plus.  :)
« Modifié: Juin 25, 2013, 02:05:52 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #26 le: Juin 25, 2013, 02:25:19 pm »
Citer
Ca n'a rien à voir, GMP prend des chaînes représentant des nombres (par exemple "126567983121"), pas des tableaux d'octets quelconques.
C'est bien pour ça que je suis obligé de convertir mon tableau d'octets en string pour je puisse ensuite représenter mes grands nombres avec gmp.

Maintenant que tu me l'as dis j'aurai pu aussi utiliser les socket SSL de Qt pour le cryptage rsa, mais pour le cryptage symétrique je préfère utiliser mon propre algorithme de chiffrement, cela est plus sécurisé que les bibliothèque dont on connait les failles.

Je ne me sert du cryptage rsa uniquement pour transférer la clé publique pour le cryptage symétrique.


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #27 le: Juin 25, 2013, 02:39:30 pm »
Citer
C'est bien pour ça que je suis obligé de convertir mon tableau d'octets en string pour je puisse ensuite représenter mes grands nombres avec gmp.
Mais il n'y a pas de nombre dans les données du paquet. Les grands nombres dont tu parles sont ceux dont tu as besoin pour le chiffrement non ? Alors quel rapport avec le fait de coller toutes les données du paquet dans un std::string ?

Citer
Maintenant que tu me l'as dis j'aurai pu aussi utiliser les socket SSL de Qt pour le cryptage rsa, mais pour le cryptage symétrique je préfère utiliser mon propre algorithme de chiffrement, cela est plus sécurisé que les bibliothèque dont on connait les failles.
Bien sûr. Et tous les logiciels qui font du chiffrement codent leur propre algorithme pour cette même raison, et du coup les bibliothèques de crypto existent juste pour faire beau. Et évidemment ton code sera plus sécurisé que ces bibliothèques ; n'hésite pas à le vendre une fois que tu auras terminé.

... :P
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #28 le: Juin 25, 2013, 03:16:24 pm »
Lol Laurent, pour le cryptage chacun à sa manière de faire et ça ne se vend pas il y a juste quelques méthodes de cryptage assymétrique qui existent et utilisés par certaines librairies et qui sont devenu un standart comme par exemple le cryptage RSA pour les fameuses licenses d'activation des logiciels par exemple.

Ca, c'est tout ce que j'ai trouvé au niveau du cryptage sur internet, le reste, ce sont plutôt des méthodes de hachage et pas de cryptage comme par exemple la méthode de hachage md5.

Mais pour le cryptage symétrique tout se résume à une simple fonction qui chiffre les données et qui ne doit justement pas être connue, il est donc peut probable que tu trouves une librairie qui fasse cela et puis mon algorithme RSA fait exactement la même chose que ce que fait le cryptage SSL utilisé par d'autres librairies qui utilisent les socket SSL et que tu pourrais aussi implémenter à la SFML si tu le veux, ces librairies utilisent utilisent juste un algorithme de hachage en plus surement pour envoyer les clés.
Sinon t'inquiéte pas pour moi je pourrai bientôt si je veux faire un site ou je pourrai vendre d'autres choses, comme par exemple un tutoriel pour créer un mmo en c++ par exemple avec la SFML.  :P
Je pense que t'en serai content tiens!
« Modifié: Juin 25, 2013, 03:19:23 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Bug, un caractère en trop dans mon paquet pour les packets perso.
« Réponse #29 le: Juin 25, 2013, 03:45:09 pm »
Ce que je veux dire, c'est pourquoi ne pas utiliser OpenSSL, qui fournit vraiment tout ce qu'il faut pour faire du chiffrement de qualité :

Citer
SYMMETRIC CIPHERS
blowfish(3), cast(3), des(3), idea(3), rc2(3), rc4(3), rc5(3)

PUBLIC KEY CRYPTOGRAPHY AND KEY AGREEMENT
dsa(3), dh(3), rsa(3)

CERTIFICATES
x509(3), x509v3(3)

AUTHENTICATION CODES, HASH FUNCTIONS
hmac(3), md2(3), md4(3), md5(3), mdc2(3), ripemd(3), sha(3)

Je ne pense pas que la sécurité d'une transmission soit assurée par le secret de l'algorithme. Je pense qu'il faut plutôt utiliser un algorithme connu pour être incassable (avec les technologies et connaissances actuelles). Je suis loin d'être un expert en chiffrement, mais je pense que si des standards et des algorithmes existent, c'est pour être utilisés. Ceux-ci sont testés, utilisés et retournés dans tous les sens tous les jours. Alors que ton algorithme, une fois que quelqu'un aura fait du reverse-engineering sur ton code, il le cassera en quelques minutes.
Laurent Gomila - SFML developer