Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Convertir un code Java

3 réponses
Avatar
Roumegou Eric
Bonjour,
je n'arrive pas à trouver l'équivalent en Wlangage de ce code Java (cf
joint)

Je dois récupérer une chaine > 32 caractères
tout ce qui est au delà du 32ème caractère est mon numéro que je
convertis
monnumero=Val(gLOGIN[[33 A]],"x")
Là où je coince, c'est que je dois contrôler ce numéro avec une
signature (les 32 premiers caracteres de la chaîne)
Cette signature est dixit "une empreinte MD5 en utilisant la clé
secrête" (ds ce code "monpetitsecret")

Avec WD, je ne trouve pas de correspondance à la fn getKeyedDigest qui
codifie en donnant une chaine en longueur fixe (ds les fn Crypte par
ex) et la fn HashChaine ne prend pas de mot de passe. Je ne trouve pas
non plus d'equivalent de byteArrayToHexString

bref c'est ce
(!byteArrayToHexString(getKeyedDigest(numClient.getBytes(),
SECRET_KEY)).toUpperCase()

que je n'arrive pas à refaire.

Merci beaucoup de votre aide.



package com.wwwwww.report.helper;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class UrlEncoderHelper
{
private final static byte[] SECRET_KEY =
"monpetitsecret".getBytes();

private static byte[] getKeyedDigest(byte[] buffer, byte[] key)
{
try
{
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(buffer);
return md5.digest(key);
}
catch (NoSuchAlgorithmException e) {}

return null;
}

/**
* Convert a byte[] array to readable string format. This makes the
"hex" readable!
* @return result String buffer in String format
* @param in byte[] buffer to convert to string format
*/
private static String byteArrayToHexString(byte in[])
{
byte ch = 0x00;
int i = 0;
if (in == null || in.length <= 0)
return null;

String pseudo[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8",
"9", "A", "B", "C", "D", "E", "F"};
StringBuffer out = new StringBuffer(in.length * 2);

while (i < in.length)
{
ch = (byte) (in[i] & 0xF0); // Strip off high nibble
ch = (byte) (ch >>> 4);
// shift the bits down
ch = (byte) (ch & 0x0F);
// must do this is high order bit is on!
out.append(pseudo[ (int) ch]); // convert the nibble to a
String Character
ch = (byte) (in[i] & 0x0F); // Strip off low nibble
out.append(pseudo[ (int) ch]); // convert the nibble to a
String Character
i++;
}
String rslt = new String(out);
return rslt;
}

public static String checkClientAllowed(String encodedNumClient)
{
String numClient = null;

if (encodedNumClient.length()<=32)
return null;

String sig = encodedNumClient.substring(0, 32);
numClient = Integer.parseInt (encodedNumClient.substring(32),
16)+"";

if (!byteArrayToHexString(getKeyedDigest(numClient.getBytes(),
SECRET_KEY)).toUpperCase().equals(sig.toUpperCase()))
return null;
else
return numClient;
}
}

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)

3 réponses

Avatar
Romain PETIT
Roumegou Eric avait prétendu :

bref c'est ce (!byteArrayToHexString(getKeyedDigest(numClient.getBytes(),
SECRET_KEY)).toUpperCase()

que je n'arrive pas à refaire.



Sur quoi coinces-tu ?

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou Eric
Romain PETIT a exposé le 11/09/2008 :
Roumegou Eric avait prétendu :

bref c'est ce (!byteArrayToHexString(getKeyedDigest(numClient.getBytes(),
SECRET_KEY)).toUpperCase()

que je n'arrive pas à refaire.



Sur quoi coinces-tu ?



Merci de t'occuper de mon pb.

Je coince sur la comparaison de la chaine constituée des 32 premiers
caractères (la signature) avec un calcul de MD5 et mot de passe sur le
numéro (ça je le récupère).

En fait je peux faire ma connexion (puisque j'ai mon n°), mais je ne
vérifierais pas la cohérence de l'ensemble (ce qui est le but du jeu)

Donc comment en Wlangage faire le getKeyedDigest de mon numeroclient
numClient.getBytes avec la clé (en dur ds le code)
c'est sensé me retourner une chaine sur 32 comme ceci par ex
A709C0E43A6208E5D4FCF2135571A4DB

le md5.digest doit retourner qq chose qui est ensuite traduit en une
chaine lisible byteArrayToHexString

en wlangage je n'ais pas trouvé de fn de cryptage qui force la taille
de retour à 32, ni qui parle d'empreinte md5.
Question md5, il y a la fn HashChaine, mais point de pwd ds cette fn.

Bref j'ai fait le tour et je ne trouve pas.
Ce que je n'ais pas capacité à comprendre, c'est : est ce que le code
java utilise des fn standards et est-il reproductible en WL ?
Donc si ce code java t'est moins abscons que pour moi, Merci d'avance

Nb le Code figure ds le post, seule le pwd a été changé.

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Romain PETIT
Roumegou Eric avait énoncé :

le md5.digest doit retourner qq chose qui est ensuite traduit en une chaine
lisible byteArrayToHexString



Donc la première des choses est de savoir ce que fait exactement la
fonction digest.
http://java.sun.com/javase/6/docs/api/java/security/MessageDigest.html
This MessageDigest class provides applications the functionality of a
message digest algorithm, such as MD5 or SHA. Message digests are
secure one-way hash functions that take arbitrary-sized data and output
a fixed-length hash value.

A priori, c'est pour faire du HMAC :
http://msdn.microsoft.com/en-us/library/ms721586(VS.85).aspx

Hash-Based Message Authentication Code

(HMAC) A symmetric keyed hashing algorithm implemented by Microsoft
cryptographic service providers. An HMAC is used to verify the
integrity of data to help ensure it has not been modified while in
storage or transit. It can be used with any iterated cryptographic hash
algorithm, such as MD5 or SHA-1. CryptoAPI references this algorithm by
its algorithm identifier (CALG_HMAC) and class (ALG_CLASS_HASH).



Jette un oeil sur la fenetre de M.Fagès.
http://www.windasso.org/cgi-bin/gesmod.exe?exec=VISU&NUMRUBRIQUEf1&MDP=&TYPE=SOURCE

Il y a déjà une bonne partie qui concerne le hash MD5 mais calculé sans
clé.
J'imagine qu'il faudra que tu modifies le code pour passer le bon algo
à la fonction CryptCreateHash (le param ConstHash).

Tu devrais alors obtenir une chaine consistuée de 16 binaires qu'il te
faudra convertir en hexadécimal (->32 caractères), ce que fait la
fonction byteArrayToHexString.

Désolé, pas trop le temps et les compétences pour approfondir (je ne
suis pas du tout spécialiste de la question...)

Bon courage.

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)