Cryptage et problème de conversion de Byte[]

deve007 Messages postés 14 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 25 août 2006 - 21 août 2006 à 18:53
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 - 25 août 2006 à 10:02
Bonjour ,

jai un  string que je doit obligatoirement convertir en tableau de Byte, cette conversion se passe mal
voici l'exemple :



jai un string :




monstring = abcdefghijkl  [12]




je le converti en Byte[] :




private byte[] monTabByte ;





monTabByte = StrToByteArray(monstring);




je déclare une variable appartenant à l'API de cryptography SymmetricAlgorithm()




private SymmetricAlgorithm mCSP = SymmetricAlgorithm.Create() ;





je doit affecter monTabByte à une variable propriétaire à la cryptography (qui représente le Vecteur d'initialisation) et qui est de type Byte []: mCSP.IV





le problème c'est que quand je trace, je trouve que la variable mCSP.IV par défaut contient un tableau de 16 élement et monTabByte ne contient que 12 !!! je sais pas coment faire face à cela, sachant que j'ai essayer de d'ajouter des bits pour atteindre les 16, mais cela me cause probleme au niveau du décryptage !





toute proposition sera la bienvenue.

8 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
21 août 2006 à 19:30
Salut, j'ai pas tout compris..

Tu es obligé de passer un tableau de 16 bytes !??

Faut voir comment marche la fonction StrToByteArray, n'oublie pas que les chars en .NET sont sur 2 octets.
0
Overkill06 Messages postés 16 Date d'inscription jeudi 29 mai 2003 Statut Membre Dernière intervention 27 septembre 2007
21 août 2006 à 19:38
La solution la plus propre pour convertir un string en tableau de byte est de passer par System.Text.
Apres il suffit de choisir l'encodage : unicode, utf8 etc...
Par exemple pour unicode tu crées un objet System.Text.UnicodeEncoding et tu appeles GetBytes

Informations :
public override int GetBytes(string s, int charIndex, int charCount, byte[ ] bytes, int byteIndex)
    Membre de System.Text.UnicodeEncoding

Résumé :
Code un jeu de caractères de la chaîne System.String spécifiée dans le tableau d'octets indiqué.

Paramètres :
s: System.String contenant le jeu de caractères à coder.
charCount: Nombre de caractères à coder.
byteIndex: Index auquel commencer l'écriture de la séquence d'octets obtenue.
charIndex: Index du premier caractère à coder.
bytes: Tableau d'octets contenant la séquence d'octets obtenue.

Valeurs de retour :
Nombre réel d'octets écrits dans bytes.

Ca marche pour utf également, regarde msdn ou Explorateur d'objets fournis dans visual studio.
0
deve007 Messages postés 14 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 25 août 2006
21 août 2006 à 20:42
je repond a 498040 Lutinore deja :




je vous donne une idée plus golbale sur mon sujet:

j'ai un Client et un Serveur je doit, la communication entre ces 2 entités ne doit pas passé en claire ! j'ai cherché aupres de la bibliothèque SSLStream en C#, mais il parait que c'est trop compliqué, donc, jai essayer de faire simple en cryptant les données avant de les envoyées. cette operation se fait via une variable mCSP de la bibliothèque [SymmetricAlgorithm ]  en fournissant une clé de cryptage ainsi qu'un vecteur d'initialisation qui a comme role d'eviter d'avoir le meme mot, le meme code crypté.

cette clé é ce vecteur dinitialisation doivent etre les meme du coté du client et du serveur chose qui permettra a ce dernier de decrypté les elements envoyées.

c'est a ce niveau ou j'ai un probleme puisque une fois ces 2 message recu par le serveur il narrive pas a stocker le 2eme ( Vecteur d'initialisation) dans un Byte[] vu qu'il n'est pas sur 2 Octets.jespere que c'est plus claire que tout a lheure.





voici le corps de la fonction  StrToByteArray: ( je pense que ca répond meme a =111463 Overkill06)





public
static
byte[] StrToByteArray(string

str)




{




System.Text.


ASCIIEncoding encoding = new System.Text.ASCIIEncoding
();





return

encoding.GetBytes(str);




}

qu'est ce que vous en pensez les gas ?
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
22 août 2006 à 11:11
Essayes avec une chaine de 8 caractères encodés en en unicode soit 16 bytes.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deve007 Messages postés 14 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 25 août 2006
23 août 2006 à 17:31
salut,

le problème que je n'arrive tjrs pas à comprendre est le suivant :

j'ai 2 fonctions l'une crypte, la seconde decrypte.

si je met ces 2 fonctions dans le meme programme et jexecute, tout est nikel, PAR CONTRE, si je prend celle qui crypte, je l'affecte soigneusement au client ( vue que c'est lui qui va envoyer les données) puis j'intègre celle qui decrypte au niveau du serveur, ca pete !!!!!  , je comprend plus rien....

et ca plante au niveau du vecteur dinitialisation :

une fois je crée un vecteur dinitialisation , je lenvoie au serveur histoire d'avoir le meme que le client qui lui permettra de décrypter la chaine que jenverrai apres! une fois recu, je le convertie a un tableau de Byte, puis je le stocke au niveau d'une variable spécifique cet effet mCSP.IV ( Initialisation Vector) qui sera utilisée par le CreateDecryptor(mCSP.Key,mCSP.IV);

et la il commence a me raconté des nulletés genre : la taille du tableau n'est pas adequate ou tableau ne doit pas etre vide sachant que quand je trace, je trouve qu'il est plein... maintenant j'ai reussit a dépassé cela mais ca plante au niveau d'une fonction
FlushFinalBlock() !!

je vous met ci dessous ma fonction qui s'occupe de decrypter la chaine envoyée par le client peut etre que ca pourrais aider à comprendre mieux mon problème :

//instanciation de SymmetricAlgorithm au début du programme serveur :

privateSymmetricAlgorithm mCSP = SymmetricAlgorithm.Create() ;// fonction de décryptage

private
string DecryptString(
string Value)

{

ICryptoTransform ct;

MemoryStream ms;

CryptoStream cs;

byte[] byt;
// le vecteur d'initialisation envoyer par le client, ici mis dans une variable pour faciliter la compréhension

String m_initVector =
"@1B2c3D4e5F6g7H8";

// conversion du vecteur d'initialisation a un tableau de Byte

Byte[] IVArray = StrToByteArray(m_initVector);

// affectation du tableau de Byte a la variable .IV qui sera utiliser par la fonction createDecryptor:
mCSP.IV = IVArray;

// de meme pour la clé de cryptage

String m_key =
"g0VjERYkOzgb5p7YGKrOH778DvfEMyqj";

Byte[] KeyArray = StrToByteArray(m_key);

mCSP.Key = KeyArray;

// ici on crée un decrypteur avec les 2 elements : clé de cryptage et vecteur dinitialisation

ct = mCSP.CreateDecryptor(mCSP.Key,mCSP.IV);

byt = Convert.FromBase64String(Value);

// allocation d'un buffer

ms =
new
MemoryStream();

cs = new
CryptoStream(ms, ct,
CryptoStreamMode.Write);

cs.Write(byt, 0, byt.Length);

// a ce niveau ca plante !!!!

cs.FlushFinalBlock();

cs.Close();

return
Encoding.UTF8.GetString(ms.ToArray());

}

est ce que quelqu'un a une bonne idée ?
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 10
23 août 2006 à 17:59
Ca ne pourrais pas être a cause du "pointeur de lecture", qui ne serait pas forcément bien positionné sur le flux (par exemple s'assurer qu'il est au début avant de lire...) ?
0
deve007 Messages postés 14 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 25 août 2006
25 août 2006 à 08:19
non je pense pas, car avant de faire se genre de communication en crypté , je lai deja effectuer en claire, et donc le pointeur de lecture marche bien puisque je lit ce que jenvoie, par contre une fois je passe au mode crypté.. les problemes commencent!!


jai même essayer de telecharger des codes sources de cryptage/ decryptage de string, et c'est la meme histoire: si c'est ds le meme programme que ca se produit, c'est bon, mais une fois on les dispatchent sur 2 programmes... ca foire !!
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 10
25 août 2006 à 10:02
En relisant ce que tu as écris dans le message au dessus (avec le code), je me demande si ce n'est pas la facon dont tu transmet les info entre tes deux programmes qui pose problème...

Comment transmet tu les infos? (ce sont deux assemblies chargée ensemble et tu appelle les méthodes de l'une et de l'autre, ou ce sont deux programmes distinct, avec transmission par réseau, etc... ?)
0