ADELIA |
VADELIA |
SADELIA |
WADELIA |
|
(I/B) |
(I/B) (C/S) |
(B) (S) |
(I/B) (C/S) |
Paragraphe d'utilisation
Tous
Syntaxe
CHIFFRER Algorithme Cle VectInit Donnees Resultat
Algorithme |
Þ |
ConstanteAlpha | VarAlpha |
|
Cle |
Þ |
*CLE(ConstanteAlpha | VarAlpha) |
|
InitVect |
Þ |
*VECT_INIT(ConstanteAlpha | VarAlpha) | Rien |
|
Donnees |
Þ |
ConstanteAlpha Normaliser| VarAlpha Normaliser |
|
Normaliser |
Þ |
*NORMALISER | Rien |
|
Resultat |
Þ |
VarAlpha Encodage |
|
Encodage |
Þ |
*HEXA | *BASE64 | Rien |
Description
Cet ordre permet de chiffrer la chaîne en entrée en utilisant l'algorithme et la clé spécifiée.
Les algorithmes de chiffrement disponibles dépendent de la plateforme et éventuellement des composants additionnels installés. Les algorithmes DES, Triple DES (DESede), AES, RC2, RC4 et RSA sont disponibles sur toutes les plateformes.
Le contenu de la variable algorithme suit le standard de nommage Java, c'est-à-dire prend la forme ALGORITHME[/MODEBLOC/PADDING] où :
-
- ALGORITHME désigne l'algorithme de chiffrement utilisé (AES, DES).
- MODEBLOC (optionnel) désigne le mode de traitement des blocs.
Par défaut, le mode ECB est utilisé. Ce paramètre n'est pas fourni pour l'algorithme RSA. - PADDING désigne le mode de padding utilisé.
Dans un algorithme de chiffrement par bloc (hors RSA), l'algorithme de chiffrement ne peut traiter qu'un nombre entier de blocs (dont la taille dépend de l'algorithme utilisé).
Si la longueur des données à chiffrer ne correspond pas à un nombre de blocs, l'algorithme de padding est utilisé pour compléter les données du bloc.
Si la valeur "NoPadding" est indiquée, la longueur des données à chiffrer doit impérativement correspondre à un nombre entier de blocs.
Adélia accepte, pour la définition du padding, une valeur spéciale "ZeroPadding", qui n'est pas un padding standard.
Cette valeur est équivalente à la spécification "NoPadding", en complétant les données par des zéros, si nécessaire, dans le cas des algorithmes de chiffrement par bloc.
Cela donne un résultat plus compact.
A l'exception de l'algorithme RSA, la clé (paramètre *CLE) doit être fournie encodée en hexadécimal (la longueur de la chaîne est donc égale à deux fois la longueur de la clé).
La clé doit impérativement avoir une longueur compatible avec l'algorithme de chiffrement utilisé.
L'algorithme RSA est un algorithme asymétrique utilisant deux clés, l'une publique, l'autre privée. Ces clés doivent être fournies au format PEM.
Lorsque le chiffrement est fait à l'aide de l'une de ces clés, le déchiffrement ne peut se faire qu'à l'aide de l'autre clé.
Usuellement, le chiffrement se fait à l'aide de la clé publique et le déchiffrement à l'aide de la clé privée, mais l'inverse est possible, ce mode étant généralement utilisé pour générer une signature.
Attention : dans le cas d'une clé privée, la clé doit être encodée au format PKCS #8 (la clé doit contenir une déclaration -----BEGIN PRIVATE KEY-----, et non -----BEGIN RSA PRIVATE KEY-----).
La version Windows (OpenSSL) et certains fournisseurs de chiffrement Java (Bouncy Castle) acceptent également les clés encodées au format PKCS#1 (-----BEGIN RSA PRIVATE KEY-----).
Le vecteur d'initialisation (paramètre *VECT_INIT) est une donnée optionnelle permettant d'ajouter une partie aléatoire au mécanisme de chiffrement. S'il est fourni, il doit être redonné à l'identique lors de la phase de déchiffrement.
Le vecteur d'initialisation doit être fourni encodé en hexadécimal. Sa longueur correspond à la longueur d'un bloc de données dans l'algorithme de chiffrement choisi - par exemple 8 octets (16 caractères encodés) pour l'algorithme DES, ou 16 octets (32 caractères encodés) pour l'algorithme AES.
Si la longueur du vecteur d'initialisation ne correspond pas à la taille requise il sera soit tronqué, soit complété par des zéros. Si l'algorithme choisi ne nécessite pas de vecteur d'initialisation, le paramètre sera ignoré.
Le paramètre *NORMALISER permet de déclencher la conversion de la chaîne d'entrée au format UTF-8. Cela permet d'obtenir un résultat indépendant de la page de code utilisée, et donc de la plateforme d'exécution.
Le paramètre d'encodage permet d'indiquer si le résultat doit être encodé en hexadécimal (*HEXA) ou en base 64 (*BASE64). Si rien n'est indiqué l'encodage sera en hexadécimal.
Pour vérifier si l'opération s'est bien déroulée, il est possible de tester le mot réservé *CODE_RETOUR.
Si une erreur a été rencontrée, ce mot réservé retourne une valeur différente de *NORMAL, et le mot réservé *MSG_RETOUR donne un descriptif de l'erreur.
Les valeurs possibles pour *CODE_RETOUR sont les suivantes :
0 |
L'opération a réussi. |
1 |
Erreur interne du moteur de chiffrement. |
2 |
Algorithme invalide. |
3 |
Clé invalide (longueur, ou format de la clé dans le cas de l'algorithme RSA). |
4 |
Vecteur d'initialisation invalide. Cette erreur n'est renvoyée que dans le cas d'un algorithme de chiffrement par bloc acceptant un vecteur d'initialisation. Dans ce cas, la longueur du vecteur d'initialisation doit correspondre à la taille du bloc de l'algorithme de chiffrement. Dans les autres cas, le vecteur d'initialisation est ignoré. |
6 |
Zone de sortie invalide. La variable de sortie est trop petite pour contenir les données chiffrées. |
Considérations relatives à la taille de la variable de sortie
La variable de sortie Adélia doit avoir une taille suffisante pour contenir les données chiffrées et encodées, sinon une erreur sera émise.
Le dimensionnement de la variable de sortie dépend de la longueur des données encodées (lenin), de l'algorithme de chiffrement utilisé et de l'encodage choisi pour les données en sortie.
Les considérations suivantes s'appliquent au calcul de la longueur des données à chiffrer (lenin, calculée en octets) :
-
- si aucune normalisation n'est faite :
- lenin = &longueur_chaine(donnees) en génération Ansi,
- lenin = &longueur_chaine(donnees) * 2 en génération Unicode ou Java (2 octets par caractère).
- si aucune normalisation n'est faite :
-
- si l'option *NORMALISER est spécifiée, lenin est compris entre &longueur_chaine(donnees) et &longueur_chaine(donnees) * 3, selon la taille des caractères UTF-8.
La taille des données binaires en sortie correspond à un nombre entier de blocs, la taille du bloc dépendant de l'algorithme choisi.
La taille des données binaires est donc lenout ((lenin / taille_bloc) + 1) * taille_bloc. Pour l'algorithme AES, la taille du bloc est de 16 octets.
La variable de sortie Adélia doit pouvoir contenir les données binaires encodées soit en hexa (lenout * 2), soit en base 64 (au maximum (4 * lenout / 3) + 3).
Particularité de l'algorithme RSA
Attention : l'algorithme RSA n'est pas un algorithme de chiffrement par bloc. Il ne permet de chiffrer qu'un seul bloc de données, dont la taille est égale à la taille de la clé.
D'autre part, l'algorithme de padding ajoute des caractères à la fin du bloc.
Avec une taille de clé de 1024 bits et l'algorithme de padding par défaut, la taille maximale des données à encoder est de 117 caractères (128 - 11).
Considérations relatives aux plateformes d'exécution
Le support des fonctions de chiffrement (algorithmes de chiffrement disponible, taille maximale des clés de chiffrement) est variable en fonction de la plateforme et de la législation applicable.
Voir la page Support du chiffrement en fonction de la plateforme pour plus d'informations.
Par exemple
*
* Chiffrement simple AES, clé 128bits, résultat encodé en hexa
*
P_DATA = 'Données secrètes'
P_ALG = 'AES'
P_SECRET_KEY = '2d2086832cc2fe3fd18cb51d6c5e99a5'
CHIFFRER P_ALG *CLE(P_SECRET_KEY) P_DATA *NORMALISER P_RESULT *HEXA
* P_RESULT = 'dbb2c1cdb7a4961341c453bd4b16a96f7552946e10bd3dff6f98e394abb442e4'