ONLINE HELP
 WINDEVWEBDEV AND WINDEV MOBILE

Help / WLanguage / WLanguage functions / Standard functions / Encryption/compression functions
  • Résultats obtenus lors d'un chiffrement AES
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Crypte une chaîne de caractères ou un buffer binaire en utilisant un algorithme de chiffrement symétrique (AES, DES, etc.). Ce message crypté pourra être décrypté avec la fonction DécrypteStandard.
Contrairement aux fonctions Crypte et Décrypte, les fonctions CrypteStandard et DécrypteStandard utilisent des algorithmes de cryptage standard qui permettent d'échanger des messages cryptés entre des plateformes d'exécution différentes (Windows, Linux, Android, Java, iOS, PHP, etc.) et/ou avec des outils tiers.
Remarque : Le premier appel à la fonction CrypteStandard peut être relativement long car il est nécessaire d'initialiser la randomisation.
// Cryptage d'une chaîne de caractères en utilisant l'algorithme AES
// ------------------------------------------------------------------
bufMessage est un Buffer = "Message à crypter"
bufClé est un Buffer = HashChaîne(HA_MD5_128, "mot de passe")
bufCrypte est un Buffer = CrypteStandard(bufMessage, bufClé, crypteAES128)
 
// Décryptage en WLangage
-------------------------
bufRésultat est un Buffer = DécrypteStandard(bufCrypte, bufClé, crypteAES128)
Info(bufRésultat)
// Cryptage en WLangage
// ---------------------
bufMessage est un Buffer = "Message à crypter"
bufClé est un Buffer = HashChaîne(HA_MD5_128, "ma chaîne à crypter")
bufCrypte est un Buffer = CrypteStandard(bufMessage, bufClé, crypteAES128)
 
//---------------------------------------------------------------
// Décryptage via un appel à l'API Mcrypt de PHP
nTailleIV est un entier = 128 / 8
bufIV est un Buffer = bufCrypte[[ À nTailleIV]]
bufDonnées est un Buffer = bufCrypte[[nTailleIV+1 À]]
 
EXTERNE mcrypt_decrypt//API PHP (à faire dans un traitement serveur WEBDEV PHP)
Trace(mcrypt_decrypt("rijndael-128", bufClé, bufDonnées, "cbc", bufIV))
Syntaxe
<Résultat> = CrypteStandard(<Message> , <Clé> [, <Algorithme> [, <Mode d'opération> [, <Remplissage> [, <Vecteur d'initialisation>]]]])
<Résultat> : Buffer binaire
  • Résultat du cryptage du message spécifié,
  • Chaîne vide ("") en cas d'erreur. Pour plus de détails sur l'erreur, utilisez la fonction ErreurInfo.
Ce buffer est composé de deux parties :
  • Le vecteur d'initialisation (Initialisation Vector ou IV) qui correspond à un bloc de bits généré aléatoirement (ou précisé avec le paramètre <Vecteur d'initialisation>) et qui a été combiné au premier bloc des données cryptées. Ce vecteur est nécessaire pour permettre le décryptage du message. Sa taille correspond à la taille des blocs utilisés par l'algorithme de cryptage (voir paramètre <Algorithme>).
  • Les données cryptées.
Si le message doit être décrypté :
  • par la fonction DécrypteStandard, il suffit de passer l'intégralité du buffer à la fonction.
  • par un outil tiers, il est nécessaire de découper le buffer pour séparer le vecteur d'initialisation des données cryptées (voir exemple).
Remarque : Si le mode d'opération spécifié est crypteECB, aucun vecteur d'initialisation n'est utilisé et dans ce cas la fonction retourne directement les données cryptées.
<Message> : Buffer binaire
Message à crypter.
<Clé> : Buffer
Clé avec laquelle les données doivent être cryptées. La taille de cette clé dépend de l'algorithme de cryptage utilisé. La taille de la clé doit correspondre à celle de l'algorithme.
Il est conseillé d'utiliser les fonctions de hachage (par exemple fonction HashChaîne) pour créer une clé à partir d'un mot de passe. Un mot de passe long et composé d'un maximum de caractères alphanumériques et symboles distincts permet une meilleure sécurité de cryptage.
Développement multiplateforme : Pour manipuler des chaînes de caractères, il est nécessaire d'utiliser le même format sur toutes les plateformes. Il est conseillé d'utiliser des chaînes au format UTF 8 (et de convertir les chaînes Unicode si nécessaire).
<Algorithme> : Constante optionnelle de type Entier
Algorithme de cryptage à utiliser :
crypte3DESTriple Data Encryption Standard.
  • Taille de la clé : 192 bits.
  • Taille des blocs : 64 bits.
  • Taille du vecteur d'initialisation (IV) : 64 bits.
crypteAES128
(Valeur par défaut)
Advanced Encryption Standard.
  • Taille de la clé : 128 bits.
  • Taille des blocs : 128 bits.
  • Taille du vecteur d'initialisation (IV) : 128 bits.
crypteAES256Advanced Encryption Standard.
  • Taille de la clé : 256 bits.
  • Taille des blocs : 128 bits.
  • Taille du vecteur d'initialisation (IV) : 128 bits.
crypteDESData Encryption Standard.
  • Taille de la clé : 64 bits.
  • Taille des blocs : 64 bits.
  • Taille du vecteur d'initialisation (IV) : 64 bits.
Attention : cet algorithme est actuellement déprécié.
<Mode d'opération> : Constante optionnelle de type Entier
Mode de traitement des blocs par l'algorithme de cryptage :
crypteCBC
(Valeur par défaut)
Cipher Block Chaining - Enchaînement des blocs
crypteCFBCipher Feedback - Chiffrement à rétroaction. Ce mode de traitement est disponible uniquement si l'algorithme utilisé correspond à la constante crypteAES256.
AndroidWidget AndroidJavaPHP Cette constante n'est pas disponible.
crypteCTRCipher Counter - Chiffrement basé sur un compteur. Ce mode de traitement est disponible uniquement si l'algorithme utilisé correspond à la constante crypteAES256.
AndroidWidget AndroidJavaPHP Cette constante n'est pas disponible.
crypteECBElectronic Code Book - Dictionnaire de codes. Ce mode d'opération est déconseillé et ne devrait être utilisé que pour des raisons de compatibilité.
Aucun vecteur d'initialisation n'est utilisé et dans ce cas la fonction retourne directement les données cryptées.
<Remplissage> : Constante optionnelle de type Entier
Mode de remplissage des données cryptées pour être compatibles avec la taille requise par les algorithmes de cryptage par blocs :
cryptePaddingPKCS
(Valeur par défaut)
Les données sont complétées par des octets dont la valeur correspond au nombre total d'octets ajoutés pour atteindre la taille requise.
cryptePaddingZéroLes données sont complétées par des zéros binaires jusqu'à obtenir la taille requise.
<Vecteur d'initialisation> : Buffer optionnel
Vecteur d'initialisation (IV) à utiliser pour le chiffrement. La taille du buffer dépend de l'algorithme de chiffrement choisi (paramètre <Algorithme>). Si ce paramètre n'est pas précisé, le vecteur d'initialisation est généré aléatoirement.
Attention : Ce paramètre doit être utilisé seulement si vous avez besoin d'un vecteur d'initialisation personnalisé dans votre projet. Dans le cas contraire, il est fortement conseillé de conserver la génération du vecteur d'initialisation en mode aléatoire.
PHP Ce paramètre n'est pas disponible.
Remarques

Résultats obtenus lors d'un chiffrement AES

Le chiffrement réalisé avec un algorithme AES utilise un vecteur d'initialisation. Ce vecteur d'initialisation est modifié à chaque appel de la fonction. Il est donc normal de ne jamais obtenir le même résultat lors du chiffrement d'une même information. Cependant, la valeur attendue est bien récupérée lors de l'appel de la fonction DécrypteStandard.
Liste des exemples associés :
Les fonctions de chiffrement (CrypteXXX, DécrypteXXX) Exemples unitaires (WINDEV) : Les fonctions de chiffrement (CrypteXXX, DécrypteXXX)
[ + ] Utilisation des fonctions de chiffrement de WINDEV.
Cet exemple permet de :
- Chiffrer une chaîne de caractères
- Déchiffrer une chaîne de caractères
Classification Métier / UI : Code métier
Composante : wd290com.dll
Minimum version required
  • Version 20
Comments
Exemplo com Fonte
https://repository.windev.com/resource.awp?file_id=281474976711928;exemplo-cryptografia-descryptografia
Boller
15 Mar. 2024
E no Windev Mobile


//Criptografia
buf_conteudo_sig is Buffer = "Meu nome é Adriano Boller"
B_senha is Buffer = HashString(HA_HMAC_MD5_128, "bob-esponja")
B_resultado_Criptografado is Buffer = CryptStandard(buf_conteudo_sig, B_senha, cryptAES128)
B_resultado_Criptografado=Encode(B_resultado_Criptografado, encodeBASE64)

Info(B_resultado_Criptografado)


//Descriptografia
B_senha = HashString(HA_HMAC_MD5_128, "bob-esponja")
B_resultado_Descriptografado is Buffer = Decode(B_resultado_Criptografado, encodeBASE64)
B_resultado_Descriptografado = UncryptStandard(B_resultado_Descriptografado, B_senha, cryptAES128)

Info(B_resultado_Descriptografado )
Boller
15 Mar. 2024
Example
//Exemplo para Criptografar
// se usar a criptografia em um arquivo texto ou ini deve fazer encode 64 bits.

sMessage is Buffer = "Message to encrypt"
bufKey is Buffer = HashString(HA_CKSUM_64, "password")
bufEncrypt is Buffer = CryptStandard(sMessage, bufKey, cryptDES)
bufEncrypt = Encode(bufEncrypt, encodeBASE64)
Info(bufEncrypt)

// Exemplo para Decriptografar
bufKey = HashString(HA_CKSUM_64, "password")
sResult is Buffer = Decode(bufEncrypt, encodeBASE64)
sResult = UncryptStandard(sResult, bufKey, cryptDES)
Info(sResult)
BOLLER
15 Mar. 2024
OBS
É muito importante fazer o encode e o decode base 64 quando usar em arquivos de texto ou arquivos ini, pois existe varios formatos de arquivos sendo eles: ansi, unicode, utf-8. E uma vez encodado e decodando a criptofrafia e descriptografia vai funcionar perfeitamente pois os caracteres originais estaram cifrados, se nao fazer o encode e decode os caracteres armazenados nao vao bater e a senha usada sera inutil e nao dara certo o procedimento.

Il est très important d'encoder et de décoder la base 64 lors de l'utilisation de fichiers texte ou de fichiers ini, car il existe plusieurs formats de fichiers : ansi, unicode, utf-8. Et une fois encodés et décodés, le cryptage et le décryptage fonctionneront parfaitement car les caractères originaux seront cryptés, si vous n'encodez pas et ne décodez pas les caractères stockés ne correspondront pas et le mot de passe utilisé sera inutile et la procédure ne fonctionnera pas.
Boller
15 Mar. 2024
Cryptage Windows <> Android (vu quelque part)
Procedure CryptageToutePlateforme(LOCAL sChaine_UNICODE est une chaîne UNICODE, LOCAL sCle_UNICODE est une chaîne UNICODE)

sChaine_UTF8 est un Buffer = ChaîneVersUTF8(sChaine_UNICODE)
sCle_UTF8 est un Buffer = ChaîneVersUTF8(sCle_UNICODE)
bufCle est un Buffer
bufCrypte est un Buffer

bufCle= HashChaîne(HA_MD5_128, sCle_UTF8)
bufCrypte = CrypteStandard(sChaine_UTF8, bufCle, crypteAES128)

RENVOYER bufCrypte



Procedure DecryptageToutePlateforme(LOCAL bufCrypte est un Buffer, LOCAL sCle_UNICODE est une chaîne UNICODE)

sCle_UTF8 est un Buffer = ChaîneVersUTF8(sCle_UNICODE)
bufCle est un Buffer
bufResultat est une Buffer

bufCle= HashChaîne(HA_MD5_128, sCle_UTF8)
bufResultat = DécrypteStandard(bufCrypte, bufCle, crypteAES128)

RENVOYER UTF8VersUnicode(bufResultat)
Ezéchias D.
31 May 2020
Valida Criptografia e Descriptografia
//Chave valida sem caracteres especiais ASCII invisiveis e sem espaços em branco ou quebras de linha


loop
resultado = criaChave(valor) //cria a chave usando cryptstandar
if valida(resultado) = true //valida regras
break // se ok para de criar
end
end
BOLLER
09 May 2018
How to actually work between WD/WM/WB
https://forum.pcsoft.fr/en-US/pcsoft.us.windevmobile/2019-wm20-w20-uncryptstandard-cryptstandard/read.awp?hl=*
Jose
25 Apr. 2018

Last update: 05/31/2023

Send a report | Local help