PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Blowfish Windev PHP
Blowfish Windev PHP
Débuté par Fabien WAMBST, 29 aoû. 2017 08:31 - 19 réponses
Posté le 29 août 2017 - 08:31
Bonjour,
je cherche à crypter une url en Blowfish CBC qui sera décryptée en PHP. Je n'arrive pas au bon cryptage avec les fonctions WinDev. Est ce que quelqu'un aurait un exemple de code pour m'aiguiller.

Merci.

>Fabien.
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 29 août 2017 - 12:02
Bonjour,

Je ne suis pas sûr que le blowfish soit supporté par windev, si ce n'est en java et php.

Ton URL doit obligatoirement être en blowfish ou tu as la main sur le script php et c'est modifiable ?

--
Cordialement,

Philippe SAINT-BERTIN
>Géode Informatique
Membre enregistré
59 messages
Posté le 29 août 2017 - 15:14
Bonjour Philippe,

>non je n'ai pas le choix je dois crypter avec l'algo Blowfish cbc et effectivement j'ai beau retourner la chose dans tous les sens je n'y arrive pas avec WinDev.
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 29 août 2017 - 15:30
Tu peux tenter en.net http://www.bouncycastle.org/csharp/

--
Cordialement,

Philippe SAINT-BERTIN
>Géode Informatique
Membre enregistré
59 messages
Posté le 29 août 2017 - 16:19
j'avais déjà regardé, mais là je ne maitrise pas du tout.
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 29 août 2017 - 17:30
Bonjour,
Une solution «temporaire» (en attendant mieux)

Avec un champ activeX -Microsoft Web Browser (etat invisible)

Initialisation de l'activeX
ActiveX1>>Navigate("http://sladex.org/blowfish.js/")


Code d'un boutton :
ActiveX1>>Navigate("javascript:blowfish.encrypt('texte à crypter', 'clef de codage', {cipherMode: 1, outputType: 0})")
Multitâche(100)
Trace(ActiveX1>>Document>>body>>outertext)// le texte crypté
ExécuteTraitement(ActiveX1,trtInit)
>
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 29 août 2017 - 18:21
Oui ça pourrait le faire ou il te reste la solution de créer une page php en localhost à laquelle tu passes ton texte et ta clé et tu récupères le texte crypté par un echo.

--
Cordialement,

Philippe SAINT-BERTIN
>Géode Informatique
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 29 août 2017 - 21:15
Bonsoir,
Seconde méthode, via un script PHP : bf.php
Pour un serveur APACHE2 sous Linux, copier ce script dans /var/www/html avec les droits 0755
/*
Exemple d'appel avec Windev. 
        // codage
IF HTTPRequête("http://adresse_serveur/bf.php?action=code&buffer=philippe%20pasquali") THEN
              Trace(HTTPDonneRésultat(httpRésultat))
END
        // décodage
IF HTTPRequête("http://adresse_serveur/bf.php?action=decode&buffer=c2q0ALjnb88Qjch0vGfXBT9mDhOLjGTY") THEN
              Trace(HTTPDonneRésultat(httpRésultat))
END
*/
class cipher {

private static $mode = 'MCRYPT_BLOWFISH';
private static $key = 'q!2wsd#45^532dfgTgf56njUhfrthu&^&ygsrwsRRsf';

public static function encrypt($buffer){
    $iv         = mcrypt_create_iv(mcrypt_get_iv_size(constant(self::$mode), MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $passcrypt  = mcrypt_encrypt(constant(self::$mode), self::$key, $buffer, MCRYPT_MODE_ECB, $iv); 
    $encode     = base64_encode($passcrypt); 
    return $encode;
}

public static function decrypt($buffer){
    $decoded    = base64_decode($buffer); 
    $iv         = mcrypt_create_iv(mcrypt_get_iv_size(constant(self::$mode), MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $decrypted  = mcrypt_decrypt(constant(self::$mode), self::$key, $decoded, MCRYPT_MODE_ECB, $iv);
    return $decrypted;
}

}
//----- data
$mystring = $_GET["buffer"];
if ($mystring == '')
{
echo "";
return;
}

//----- action 'code' ou 'decode'
$action = $_GET["action"];
if ($action == 'code') {
     $mystring = cipher::encrypt($mystring);
     echo $mystring;
}
elseif ($action == 'decode') {
$mystring = cipher::decrypt($mystring);
echo $mystring;
}
else {
echo '';
}
return
?>
>
Membre enregistré
59 messages
Posté le 30 août 2017 - 09:29
Bonjour,

tout d'abord merci d'avoir pris le temps de me répondre.
Je viens d'essayer avec sladex et je n'obtient pas le résultat attendu.
En fait la chaine à crypter est "DILICOM:9782000000006-3010000000006"
la clé de cryptage est "motdpasseDilicom"
et j'ai un vecteur d'initialisation "00000000"

et le résultat à obtenir est YVV2myd52pjPexG2wGveNSgRgdsT-PfaxI4MxC9WYQEz5alOtdHD4Q


>fabien.
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 30 août 2017 - 11:05
Bonjour,
Je suppose que vous n'avez pas communiqué le véritable mot de passe...
Voici le code PHP modifié (si vous pouvez pas le tester prévenez moi)

class cipher {

private static $mode = 'MCRYPT_BLOWFISH';
private static $key = 'motdpasseDilicom'; //Mettre ici le bon mot de passe

public static function encrypt($buffer){
    $iv . "00000000";                                              // Vecteur
    $passcrypt  = mcrypt_encrypt(constant(self::$mode), self::$key, $buffer, MCRYPT_MODE_CBC, $iv);
    $encode     = base64_encode($passcrypt); 
    return $encode;
}

public static function decrypt($buffer){
    $decoded    = base64_decode($buffer); 
    $iv . "00000000";                                          // Vecteur
    $decrypted  = mcrypt_decrypt(constant(self::$mode), self::$key, $decoded, MCRYPT_MODE_CBC, $iv);
    return $decrypted;
}

}
//----- data to encode ou decode
$mystring = $_GET["buffer"];
if ($mystring == '')
{
echo "";
return;
}

//----- action encode ou decode
$action = $_GET["action"];
if ($action == 'code') {
     $mystring = cipher::encrypt($mystring);
     echo $mystring;
}
elseif ($action == 'decode') {
$mystring = cipher::decrypt($mystring);
echo $mystring;
}
else {
echo '';
}
return
?>
>
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 30 août 2017 - 14:44
Bonjour,

Perso, j'ai fait un truc tout bête, j'ai saisi le code suivant dans une page et je l'ai affichée. Voici ce que je récupère:
echo base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH, "motdpasseDilicom", "DILICOM:9782000000006-3010000000006", MCRYPT_MODE_CBC, "00000000"))

YVV2myd52pjPexG2wGveNSgRgdsT+PfaxI4MxC9WYQHW4dXU3o79yg==


Je n'ai donc pas la même chose que toi . Es tu sûr de la valeur YVV2myd52pjPexG2wGveNSgRgdsT-PfaxI4MxC9WYQEz5alOtdHD4Q ?

Au passage, la fonction mcrypt_encrypt est passée en deprecated depuis php 7.1 et sera supprimée dans php 7.2, attention donc à la version de php installée sur ton serveur.
--
Cordialement,

Philippe SAINT-BERTIN
>Géode Informatique
Message modifié, 30 août 2017 - 14:46
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 31 août 2017 - 10:24
Bonjour
J'ai du faire une erreur dans mon code PHP (je suis débutant dans ce langage...)
Après simplifications je trouve le même résultat que «Philippe SB».

Voulant vérifier avec une autre méthode, j'ai récupéré blowfish.js sur la page «http://sladex.org/blowfish.js/»
J'ai interfacé ce code JS avec Windev en utilisant l'assemblage "System.Windows.Forms" et la classe WebBrowser.
Résultat : YVV2myd52pjPexG2wGveNSgRgdsT+PfaxI4MxC9WYQEz5alOtdHD4Q== ('+' à la place du '- et "==" à la fin)
Théorie : YVV2myd52pjPexG2wGveNSgRgdsT-PfaxI4MxC9WYQEz5alOtdHD4Q
>PHP : YVV2myd52pjPexG2wGveNSgRgdsT+PfaxI4MxC9WYQHW4dXU3o79yg==
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 31 août 2017 - 10:41
ps
>sur une bonne dizaine de site testé je n'ai jamais eu le même résultat sauf sur 1 site ou j'obtiens le résultat du script PHP.......
Membre enregistré
59 messages
Posté le 31 août 2017 - 11:18
Bonjour,

tout d'abord un grand merci à tous les deux pour votre aide. J'attends encore une réponse du fournisseur de mon client pour des infos complémentaires. Eux me conseille de passer par un script Shell :
#encrypt

key_hex=`echo -e "print '${key}'.encode('hex')" | python`

iv_hexa=`echo -e "print '${iv}'.encode('hex')" | python`

#final encrypt blowfich cbc

result=`echo -n "DILICOM:${ean}-${emet}" | openssl enc -bf-cbc
-nosalt -K "${key_hex}" -iv "${iv_hexa}" | openssl enc -base64 | tr
'+' '-' | tr '/' '_' | tr '=' ' '`

echo $result

link = "http://images1.centprod.com/3025592163107/[9]" + result +
"-cover-medium.jpg";


Philippe P : tu as réussis à obtenir YVV2myd52pjPexG2wGveNSgRgdsT+PfaxI4MxC9WYQEz5alOtdHD4Q== directement dans WinDev ?
je serai très intéressé par le code que tu as utilisé. Si tu veux tu peux me contacter via l'adresse fabien.wambst@g-sys.lu


>Fabien.
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 31 août 2017 - 11:59
tu as réussis à obtenir YVV2myd52pjPexG2wGveNSgRgdsT+PfaxI4MxC9WYQEz5alOtdHD4Q== directement dans WinDev ?
je serai très intéressé par le code que tu as utilisé. Si tu veux tu peux me contacter via l'adresse fabien.wambst@g-sys.lu


Non j'ai eu ce résultat par une page php installée en local. Il n'y a plus qu'à l'appeler par un httprequete et le tour est joué. Mais encore faut-il que le résultat soit bien celui attendu par ton fournisseur.

--
Cordialement,

Philippe SAINT-BERTIN
>Géode Informatique
Message modifié, 31 août 2017 - 12:00
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 31 août 2017 - 12:31
Fabien WAMBST a écrit :
Philippe P : tu as réussis à obtenir YVV2myd52pjPexG2wGveNSgRgdsT+PfaxI4MxC9WYQEz5alOtdHD4Q== directement dans WinDev ?
je serai très intéressé par le code que tu as utilisé. Si tu veux tu peux me contacter via l'adresse fabien.wambst@g-sys.lu
Fabien.


Bonjour,
Le résultat est bien récupéré directement dans Windev.
J'avoue que je suis débutant en JS et que j'en suis au stade découverte du .NET alors Il faut voir ce code comme une étude...

1) Récupération du script à l'adressehttp://sladex.org/blowfish.js/ext/blowfish.jset enregistrement dans ComplèteRep(fRepEnCours())+"blowfish.js"

2) Avec Notepad++ création d'une page ComplèteRep(fRepEnCours())+"blowfish.html"
/////début du fichier blowfish.html/////
<html>
<body>
<p id="data">default data</p>
<p id="clef">default key</p>
<p id="vecteur">default vecteur</p>

<script>

function Encode(){
var sData = document.getElementById("data").innerText;
var sClef = document.getElementById("clef").innerText;
var sVecteur = document.getElementById("vecteur").innerText;
blowfish.setIV(sVecteur, 0); //sVecteur codé en base64
return blowfish.encrypt(sData, sClef, {cipherMode: 1, outputType: 0});
};

///// le scrip blowfish.js/////

///// fin de fichier blowfish.html /////
</script>
</body>
</html>


3) Dans Windev ajouter l'assemblage .NET «System.Windows.Forms»

4) Dans Windev code d'un bouton :
CodeHTMLest une chaîne UNICODE=fChargeTexte(ComplèteRep(fRepEnCours())+"blowfish.html")
IFCodeHTML=""THEN RETOUR
myWebBrowserest unWebBrowser
myHtmlDocumentest unHtmlDocument dynamic
myHtmlElementest unHtmlElement dynamic
//------
ScriptNameest une chaîne UNICODE="encrypt"
retourJSest une chaîne
IdNameest une chaîne UNICODE

//-------------------------------------------
IFCodeHTML=""THEN RETOUR
myWebBrowser:DocumentText=CodeHTML
//----- Très important ------//
// On attend le chargement du code HTML
// en attendant de trouver un autre moyen plus propre
WHILEmyWebBrowser:DocumentText<>CodeHTML
Multitâche(1)
END

myHtmlDocument=myWebBrowser:Document
IFmyHtmlDocument<>Null THEN
IdName="data"
myHtmlElement=myHtmlDocument:GetElementById(IdName)
myHtmlElement:InnerText="DILICOM:9782000000006-3010000000006"

IdName="clef"
myHtmlElement=myHtmlDocument:GetElementById(IdName)
myHtmlElement:InnerText="motdpasseDilicom"

IdName="vecteur"
myHtmlElement=myHtmlDocument:GetElementById(IdName)
myHtmlElement:InnerText=Crypte(Répète("0",8),"",crypteAucun,encodeBASE64)

//-----
ScriptName="Encode"
retourJS=myWebBrowser:Document:InvokeScript(ScriptName)
IFretourJS="0"THEN RETOUR ELSETrace(retourJS)
END


>il y a surement plein d'autres façon de le faire
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 31 août 2017 - 19:28
En regardant le script shell j'ai compris pourquoi je n'obtenais pas exactement la même chose :
YVV2myd52pjPexG2wGveNSgRgdsT+PfaxI4MxC9WYQEz5alOtdHD4Q==
au lieu de
YVV2myd52pjPexG2wGveNSgRgdsT-PfaxI4MxC9WYQEz5alOtdHD4Q
car à la fin du script il y a : tr '+' '-' | tr '/' '_' | tr '=' ' '` qui remplace le '+' en '-', le '/' en '_' et supprime les '='

La commande Linux «openssl» donne la même chose que le script «blowfish.js» pas PHP !
Mais comme à souligné Philippe SB, «la fonction mcrypt_encrypt est passée en deprecated depuis php 7.1 et sera supprimée dans php 7.2»
>Donc à éviter
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 01 septembre 2017 - 06:32
Bonjour,

Sinon voici le script php qui fonctionne depuis php 5 et qui est le remplaçant de mcrypt_encrypt. C'est plus simple que le code js en comprehension. Il te suffit de déployer une page php sur un serveur avec le support de openssl

Du coup basé sur le script de Philippe:
$mystring = $_GET["buffer"];
if ($mystring === ""){
    echo "";
    return;
}

static $key = 'motdpasseDilicom';
static $iv = "00000000";
echo base64_encode(openssl_encrypt($mystring ,"BF-CBC",$key,OPENSSL_RAW_DATA, $iv));
?>


L'appel de la page:
http://localhost/cipher.php?buffer=DILICOM:9782000000006-3010000000006*

Resultat: YVV2myd52pjPexG2wGveNSgRgdsT+PfaxI4MxC9WYQEz5alOtdHD4Q==


Un simple httprequete, httpdonneresultat te donne ce que tu souhaites.

--
Cordialement,

Philippe SAINT-BERTIN
>Géode Informatique
Membre enregistré
59 messages
Posté le 01 septembre 2017 - 08:33
Bonjour,

un grand merci à tus les deux. Cela faisait un moment que j'étais bloqué sur ce point.

>Fabien.
Membre enregistré
2 messages
Posté le 20 avril 2018 - 09:50
Bonjour à tous,

Je déterre le sujet un peu tard mais Fabien je suis face à la même situation que toi, comment as-tu procéder pour le cryptage du coup ?

Merci de ta réponse.

Bonne journée

Cordialement

--
>Nicolas Guiot