Cryptage et problème de conversion de Byte[]

Signaler
Messages postés
14
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
25 août 2006
-
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
-
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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.
Messages postés
16
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
27 septembre 2007

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.
Messages postés
14
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
25 août 2006

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 ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Essayes avec une chaine de 8 caractères encodés en en unicode soit 16 bytes.
Messages postés
14
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
25 août 2006

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 ?
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
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...) ?
Messages postés
14
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
25 août 2006

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 !!
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
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... ?)