|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
Débuté par Cendrine, 20 jan. 2022 19:00 - 7 réponses |
| |
| | | |
|
| |
Posté le 20 janvier 2022 - 19:00 |
Bonjour la Team, J'essaye de convertir une fonction codé en C vers Windev mais je bloque... public static string ConvertSn(string sn) { string str = ""; long num = long.Parse(sn, NumberStyles.AllowHexSpecifier); for (int index = 0; index < 4; ++index) { str += (char)(object) "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€"[(int) (num & 63L)]; num >>= 6; } return str; }
Merci de votre aide |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 227 messages Popularité : +18 (20 votes) |
|
Posté le 21 janvier 2022 - 14:40 |
Bonjour,
ça fait 15 que j'ai pas fait de C
Mais si je comprends c'est une fonction qui doit retirer des caractères d'une chaine ? Seuls les caractères suivant "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€" doivent être gardé?
C'est exact. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 945 messages Popularité : +102 (110 votes) |
|
Posté le 21 janvier 2022 - 21:07 |
Bonjours à votre place au lieu de traduire cette fonction je l'ajouterais directement dans le code Windev cela vous évitera de générer des erreurs pour cela regardez ce post https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/239701-saisir-code-239894/read.awp…
-- «Nos clients sont nos meilleurs beta testeur.» H. Mintzberg «Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 351 messages Popularité : +75 (75 votes) |
|
Posté le 24 janvier 2022 - 01:35 |
Bonjour Cendrine,
Gurdarr a écrit :
Bonjour,
ça fait 15 que j'ai pas fait de C
Mais si je comprends c'est une fonction qui doit retirer des caractères d'une chaine ? Seuls les caractères suivant "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€" doivent être gardé?
C'est exact. Pas vraiment ... c'est donc inexact ! Au coin !
Cendrine a écrit :
Bonjour la Team, J'essaye de convertir une fonction codé en C vers Windev mais je bloque...
> public static string ConvertSn(string sn) { Déclaration d'une fonction ConvertSn avec comme paramètre "sn" qui est une chaine et qui retourne une chaine Equivalent :Procedure ConvertSn(sn est une chaine) : chaine
string str = ""; Déclaration d'une chaine Equivalent :str est une chaine = "" > long num = long.Parse(sn, NumberStyles.AllowHexSpecifier); Retourne dans la variable "num" de type entier sur 4 octets la conversion de la chaine hexadécimal qui est dans la variable "sn" Equivalent :num est un entier sur 4 octets = HexaVersEntier(sn)
for (int index = 0; index < 4; ++index) { Boucle de 0 à 3 Equivalent :Pour index = 0 _A_ 3 > str += (char)(object) "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€"[(int) (num & 63L)]; Ajoute dans la chaine "str" le caractère qui est à la position des 6 premiers bits de "num" (ATTENTION ... les tableaux en C commencent à 0 et non à 1), il faut donc ajouter 1. Equivalent :Milieu("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€",ETBinaire(num,63) + 1,1)
num >>= 6; Réalise un décalage à droite de 6 bits sur la variable "num" Equivalent :num = bitDécaleDroite(num,6) > } Equivalent :FIN
return str; Equivalent :Renvoyer str
}
Merci de votre aide Ce qui donne :
Procedure ConvertSn(sn est une chaîne) : chaîne
str est une chaîne = "" num est un entier sur 4 octets = HexaVersEntier(sn) POUR index = 0 _À_ 3 str += Milieu("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€",ETBinaire(num,63) + 1,1) num = bitDécaleDroite(num,6) FIN Ce n'est pas compliqué ... pas besoin d'utiliser du C# pour ce genre de code.
Et pour finir ... la même routine mais 2,5 fois plus rapide :
Procedure ConvertSn(sn est une chaîne) : chaîne
table est une chaîne = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€" str est une chaîne = "" num est un entier sur 4 octets = HexaVersEntier(sn) POUR index = 1 _À_ 24 PAS 6; str += table[num[index SUR 6] + 1]; FIN RENVOYER str
-- Bon développement, Patrick [3po.fr] |
| |
| |
| | | |
|
| | |
| |
Posté le 24 janvier 2022 - 13:27 |
Philippe Pasquali -> Ce que je fais déjà mais je veux sortir de l'utilisation des librairies .NET.
Patrick ALLÉMOZ -> Merci c'est au top, je teste et reviens vers vous. |
| |
| |
| | | |
|
| | |
| |
Posté le 24 janvier 2022 - 18:39 |
Merci ça marche super Alors comme tout est ok et comme vs êtes de bon conseil j'ai une dernière fonction en C que je souhaite convertir.
gsNumérodeserie est une chaine ="DEDRD4417"
machaine est une chaîne = encodeSerial(gsNumérodeserie,"motdepasse")
/// J'appelle ma procedure en C public static string encodeSerial (string gsNumérodeserie, string key) { DESCryptoServiceProvider cryptoServiceProvider = new DESCryptoServiceProvider(); cryptoServiceProvider.Key = Encoding.ASCII.GetBytes(key); cryptoServiceProvider.IV = cryptoServiceProvider.Key; ICryptoTransform encryptor = cryptoServiceProvider.CreateEncryptor(); byte[] bytes = Encoding.ASCII.GetBytes(s); return Convert.ToBase64String(encryptor.TransformFinalBlock(bytes, 0, bytes.Length)); }
J'ai commencé à essayer ceci en WD :
macle est un Buffer = HashChaîne(HA_SHA_160, gsNumérodeserie) Trace(Crypte(macle,"motdepasse",crypteAucun,encodeBASE64))
Mais je n'ai pas les même résultats... je pense un problème au niveau du HashChaîne(HA_SHA_160, gsNumérodeserie)
Merci de votre aide |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 846 messages Popularité : +227 (347 votes) |
|
Posté le 24 janvier 2022 - 22:06 |
Bonjour, Dans un premier temps, pour la même chaine, deux appels à une même fonction de chiffrement donnera 2 résultats différents. Dans un deuxième temps, il existe de nombreux algorithmes de chiffrement. En WL, CrypteStandard (qui remplace Crypte) en propose 4. Enfin il existe aussi de nombreuses fonctions de hachage.
Sachant que tu ne connais ni l'algo de chiffrement, ni l'algo de hashage, tu ne peux pas reproduire de manière fiable la fonctionnement de la fonction C que tu appelles. D'après ma première remarque ce serait de toute façon un pure hasard que tu te retrouve avec le même résultat
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 351 messages Popularité : +75 (75 votes) |
|
Posté le 26 janvier 2022 - 00:58 |
Bonjour Cendrine,
Cendrine a écrit :
Merci ça marche super Alors comme tout est ok et comme vs êtes de bon conseil j'ai une dernière fonction en C que je souhaite convertir. De rien ! Je pense que ta routine C était plutôt du genre : public static string encodeSerial (string s, string key) L'algorithme de cryptage est clairement indiqué dans le code, c'est DES, un vieux truc que l'on n'utilise plus depuis le siècle dernier vu qu'il faut très peu de temp pour le cracker ... mais bref ce n'est pas le sujet. Ce cryptage nécessite une clé sur 64 bits ... soit 8 caractères. Le retour se fait en Base64
Voila ce qui devrait correspondre à ton code, à tester car je n'ai rien sous la main pour le faire aujourd'hui :
gsNumérodeserie est un Buffer = "DEDRD4417" Clé est un Buffer = "password" Chaine_Cryptée est une chaîne = Encode(CrypteStandard(gsNumérodeserie,Clé,crypteDES),encodeBASE64SansRC) Trace(Chaine_Cryptée) Chaine_Décryptée est une chaîne = DécrypteStandard(Decode(Chaine_Cryptée,encodeBASE64SansRC),Clé,crypteDES) Trace(Chaine_Décryptée) Attention ... chaque cryptage est différent car le mot de passe permet la génération d'un vecteur d'initialisation (IV) aléatoire. Pour tester ton cryptage, il faut donc le décrypter avec la clé !
-- Bon développement, Patrick [3po.fr] |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|