Encodage

ASN.1

Non ceci n’est pas le nom d’une grippe venue d’une contrée lointaine.

Il s’agit d’un acronyme pour Abstract Syntax Notation One. Derrière ces mots, se cache une façon de représenter les structures de données dans le monde des systèmes informations.  Quand on veut transmettre des données par voie électronique, par exemple, on se demande souvent comment l’appareil distant peut les reconnaître.

L’ASN.1 est là pour répondre à cette question. Plusieurs organismes se sont mis d’accord en 1984 pour créer un standard d’encodage de données. Ainsi, l’ASN.1 permet-il de formaliser la représentation des données dans une syntaxe abstraite (d’où le nom :)).

La description en ASN.1 d’une structure de données a pour but d’obtenir une spécification de la structure qui est indépendante d’un encodage lié a un matériel particulier et sans ambiguité. Il est notamment très utilisé dans les standards PKCS.

DER
Le DER est en fait un dérivé de l’encodage BER :
BER (Basic Encoding Rules) : Standard d’encodage pour les données respectant une syntaxe ASN.1.
DER (Distinguished Encoding Rules) : Sous Ensemble du BER qui comme nous allons le voir garantit l’unicité de l’encodage.

Dans le cas du BER, les données sont encodées en blocs qui se découpent en 3 parties sémantiquement distinctes :

  • Le Type
  • La Longueur
  • La Valeur

On parle donc d’encodage TLV de l’information.

Le type est représenté par un tag sur un octect : la valeur des 2 bits de poids fort détermine la classe du type comme suit :

                  Class            Bit  Bit
                                   8    7
                  universal        0    0
                  application      0    1
                  context-specific 1    0
                  private          1    1

Voici à titre d’exemple, quelques types auxquels on peut se retrouver confronter dans la vrai vie :

    Type                     Tag            Tag 
                          (decimal)     (hexadecimal)
    INTEGER                  2              02
    BIT STRING               3              03
    OCTET STRING             4              04
    NULL                     5              05
    OBJECT IDENTIFIER        6              06
    SEQUENCE and SEQUENCE OF 16             10
    SET and SET OF           17             11
    IA5String                22             16
    UTCTime                  23             17

De la même façon, l’encodage de la longueur suit une logique très précise en BER/DER :

Soit l la longueur de la donnée à encoder :

  • Si l < 128 : on code la longueur sur un octet directement
  • Si 128 \le l < 256 : on code la longueur de la longueur 0x81 puis on
    met la longueur sur 1 octet
  • Si 256 \le 2 < 65536 : on code la longueur de la longueur 0x82 puis
    on met la longueur sur 2 octets
  • Si 2^{8n} < l < 2^{8(n+1)} : on code la longueur de la longueur 0x80 + n
    puis on met la longueur sur n octets

A noter qu’il est possible de ne pas s’embêter avec l’encodage de la longueur. En effet nous pouvons tout à fait en BER (mais pas toujours en DER) utilisé la longueur 0x80, la longueur est alors implicite et la fin de la valeur est déterminée par un double octet 00 00.

Le DER est un sous ensemble du BER avec quelques restrictions afin d’assurer l’unicité de l’encodage : pour les plus matheux d’entre nous, le DER est une forme canonique du BER.

Ainsi en DER :

  • La longueur des données de type BitString, OctetString, et Restricted Character est encodé systématiquement en suivant la méthode explicite (ie: l’utilisation de 0x80 est interdite).
  • Les champs des Set sont ordonnées en fonction de la valeur de leurs tags

Ces deux contraintes permettent d’assurer l’unicité de l’encodage de certaines données : cela est particulièrement pertinent dans le certificat, ou autre fichier signé : la vérification de l’intégrité de l’information dépend de cette unicité de représenter celle-ci.

Base64

      On veut pouvoir envoyer les données à travers des canaux qui par exemple ne supporte que les caractères imprimables (comme les emails par exemple) : il faut donc alors convertir l’information en utilisant que ce type de caractère : l’encodage base64 répond à ce besoin :
  • Basé sur un alphabet de 64 caractères : ABCDE…WXYZabc…vwxyz0123456789+/
  • 3 caractères sont encodés sur 4
  • Si besoin, le caractère = est utilisé pour le bourrage.

Donc voici quelques exemples d’encodage :
b64

Et en goodies le code latex pour générer ce beau tableau :

\begin{tiny}
\begin{table}
                \centering
                               \begin{tabular}{c|c|c|c|c|c|c|c|c|c|c|c|c|}

                                               \textbf{ASCII} & \multicolumn{4}{|c|}{F}           & \multicolumn{4}{|c|}{U} &                \multicolumn{4}{|c|}{N} \\
                               \hline
                                               \textbf{HEX}       & \multicolumn{4}{|c|}{ 0x46} &           \multicolumn{4}{|c|}{0x55} &                \multicolumn{4}{|c|}{0x4E} \\
                               \hline
                                               \textbf{Binary}&             01&00&01&10&01&01&01&01&01&00&11&10 \\
                               \hline
                                               \textbf{Index} & \multicolumn{3}{|c|}{17} & \multicolumn{3}{|c|}{37} & \multicolumn{3}{|c|}{21} & \multicolumn{3}{|c|}{14} \\
                               \hline
                                               \textbf{Base64} &\multicolumn{3}{|c|}{R}&\multicolumn{3}{|c|}{l}&\multicolumn{3}{|c|}{V}&\multicolumn{3}{|c|}{O} \\
\\
\\

                                               \textbf{ASCII} & \multicolumn{4}{|c|}{a}           & \multicolumn{4}{|c|}{} &                \multicolumn{4}{|c|}{} \\
                               \hline
                                               \textbf{HEX}       & \multicolumn{4}{|c|}{ 0x61} &           \multicolumn{4}{|c|}{} &                \multicolumn{4}{|c|}{} \\
                               \hline
                                               \textbf{Binary}&             01&10& 00&01& \textcolor{red}{00} & \textcolor{red}{00} & - & - & -&-&-&- \\
                               \hline
                                               \textbf{Index} & \multicolumn{3}{|c|}{24} & \multicolumn{3}{|c|}{16} & \multicolumn{3}{|c|}{-} & \multicolumn{3}{|c|}{-} \\
                               \hline
                                               \textbf{Base64} &\multicolumn{3}{|c|}{Y}&\multicolumn{3}{|c|}{Q}&\multicolumn{3}{|c|}{=}&\multicolumn{3}{|c|}{=} \\
                                               \\
                                               \\
                                               \textbf{ASCII} & \multicolumn{4}{|c|}{I}            & \multicolumn{4}{|c|}{t} &                \multicolumn{4}{|c|}{} \\
                               \hline
                                               \textbf{HEX}       & \multicolumn{4}{|c|}{ 0x49} &           \multicolumn{4}{|c|}{0x74} &                \multicolumn{4}{|c|}{} \\
                               \hline
                                               \textbf{Binary}&             01&00& 10&01& 01&11& 01&00& \textcolor{red}{00}&-&-&- \\
                               \hline
                                               \textbf{Index} & \multicolumn{3}{|c|}{18} & \multicolumn{3}{|c|}{23} & \multicolumn{3}{|c|}{16} & \multicolumn{3}{|c|}{-} \\
                               \hline
                                               \textbf{Base64} &\multicolumn{3}{|c|}{S}&\multicolumn{3}{|c|}{X}&\multicolumn{3}{|c|}{Q}&\multicolumn{3}{|c|}{=} \\
                               \end{tabular}
                \label{tab:Exemple2}
\end{table}
\end{tiny}
Publicités

A propos JoMendes

Amateur de mathématiques et d'hexadécimal. Je m'intéresse de près ou de loin suivant mon niveau à tous les sujets de sécurité de l'information.
Cet article, publié dans Cryptographie Asymétrique, est tagué , , . Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s