OVH Cloud OVH Cloud

java, cryptologie, et operateur de bit a bit.

4 réponses
Avatar
Nanar Duff
Bonjour,


j' essaye de comprendre un programme en java produit par le
decompilateur jad.

J' ai plusieurs questions:

1) j' ai un message codé à l' aide de la classe
java.security.MessageDigest (MessageDigest.getInstance). Mais je n'
arrive pas à trouver quel est la fonction permettant de decrypter ce
message. Quelqu' un saurait svp ?

2)j' essaye de comprendre l' instruction suivante: "byte1 = byte0 &
0xff". (byte0 et byte1 sont des variables de type byte). Si j' ai bien
compris, cette instruction est equivalente à "byte1 = byte0" non ?

3)cette instruction: "l2 = l1 & 0x3f" (l2 et l1 sont des integer)
remplie-t-elle bien l2 avec les 6 bits les plus faible de l1 (ceux
"situés à gauche") et mets les autres bits restant à 0 ? Si oui y'
a-t-il un moyen de recuperer l1 en ayant l2 ?

4)J' essaye de comprendre l' obscure boucle suivante:

for(int i = 0; i < abyte0.length; i++)
s1 = s1 + Integer.toHexString(256 + (abyte0[i] & 0xff)).substring(1);

(s1 est une String, abyte0 est un tableau de byte)

Si j' ai bien compris: a chaque tour de boucle, on va rajouter quelque
chose à la fin de s1. Ce sera abyte0[i], valeur à laquelle on rajoute
256. Mais je ne comprends pas ici l' interet de Integer.toHexString et
de substring(1).




Merci d' avance.

4 réponses

Avatar
Sylvain
Nanar Duff wrote on 04/05/2006 18:46:

1) j' ai un message codé à l' aide de la classe
java.security.MessageDigest (MessageDigest.getInstance). Mais je n'
arrive pas à trouver quel est la fonction permettant de decrypter ce
message. Quelqu' un saurait svp ?


"décrypter" n'a aucune signification en crypto (peut être pour une télé
privée ce qui n'est pas le sujet).

si vous pensez à une fonction inverse, la fonction de hash - générant un
"message digest" est dite "one-way", elle n'est pas inversible (ou alors
l'algo est bon à jeter); donc il n'existe aucun algo et aucune classe
réalisant cela.

si vous vouliez seulement dire "donner un sens" au résultat obtenu, cela
n'a également pas de sens logique, le message digest est ce qu'il est,
c'est à dire une empreinte numérique.


2)j' essaye de comprendre l' instruction suivante: "byte1 = byte0 &
0xff". (byte0 et byte1 sont des variables de type byte). Si j' ai bien
compris, cette instruction est equivalente à "byte1 = byte0" non ?


si l'opération existe comme t-elle, elle ne sert à rien.

3)cette instruction: "l2 = l1 & 0x3f" (l2 et l1 sont des integer)
remplie-t-elle bien l2 avec les 6 bits les plus faible de l1 (ceux
"situés à gauche") et mets les autres bits restant à 0 ? Si oui y'
a-t-il un moyen de recuperer l1 en ayant l2 ?


3Fh font, imho, 10 bits (2 + 8) pas 12.

ayant compris que les 6 bits de poids fort de l1 ont été effacés lorsque
le résultat est dans l2; que signifie récupérer l1 ayant l2 ?? vous
imaginez les rétrouver dans le fantome d'une onde mystérieure générée
par votre CPU lorsqu'il a traité cette opération ??

au delà, vos questions laissent comprendre qu'ayant fait du reverse
(désassemblage) sur un byte-code Java vous souhaitez "casser" un code
généré par cet algo pour retrouver le clair; si c'est le cas, cela me
parait mal barré car les autres questions montrent bcp de tatonnement;
si votre propos est de modifier / adapter un algo après l'avoir
réserver, la valeur de l1 est seule qu'il a au moment où il apparait
dans "l2 = l1 & 0x3F;" ce signifie alors "récupérer" ce qui est déjà là?

4)J' essaye de comprendre l' obscure boucle suivante:

for(int i = 0; i < abyte0.length; i++)
s1 = s1 + Integer.toHexString(256 + (abyte0[i] & 0xff)).substring(1);

(s1 est une String, abyte0 est un tableau de byte)


s1 devrait être un StringBuffer, pas une String.

le codage est un peu surfait, l'auteur s'est surement embrouillé sur des
craintes de nombres négatifs qui n'existeront pas.

- chaque octet du tableau est lu (abyte0[i])
- est converti en int positif (& 0xff)
- ramené dans l'intervalle [256..512[ ([0x0100 .. 0x01FF[)
- convertit en chaine (qui aura tjrs 2 car.) dont on prend le second
car. (celui à partir de l'offset 1).

s1 = s1 + Integer.toHexString(abyte0[i] & 0xff);
aurait donné le même résultat.

Sylvain.

Avatar
Real Gagnon
2)j' essaye de comprendre l' instruction suivante: "byte1 = byte0 &
0xff". (byte0 et byte1 sont des variables de type byte). Si j' ai
bien compris, cette instruction est equivalente à "byte1 = byte0" non
?


si l'opération existe comme t-elle, elle ne sert à rien.


Tout depend du contexte. En Java, lors d'un conversion d'un byte vers un
int, le byte sera toujours considere comme signé d'ou la necessite de
masquer le signe avec un "& 0xff".

public class UnsignedByte {
public static void main (String args[]) {
byte b1 = 127;
byte b2 = -128;
byte b3 = -1;

System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(unsignedByteToInt(b1));
System.out.println(unsignedByteToInt(b2));
System.out.println(unsignedByteToInt(b3));
` /*
127
-128
-1
127
128
255
*/
}

public static int unsignedByteToInt(byte b) {
return (int) b & 0xFF;
}
}

Bye.
--
Real Gagnon from Quebec, Canada
* Looking for Java or PB code examples ? Visit Real's How-to
* http://www.rgagnon.com/howto.html


Avatar
Sylvain
Real Gagnon wrote on 05/05/2006 00:01:

si l'opération existe comme t-elle, elle ne sert à rien.



Tout depend du contexte. En Java, lors d'un conversion d'un byte vers un
int, le byte sera toujours considere comme signé d'ou la necessite de
masquer le signe avec un "& 0xff".


oui, je sais cela depuis que Java existe, on voudra d'ailleurs lire que
tout type primitif est toujours signé (dans une opération arithmétique,
une évaluation booléenne et (mais pas que) lors d'une conversion de type).

de plus, l'opération "& 0xff" ne consiste pas à "masquer" un signe mais
à mettre les 3 octets de poids fort du résultat à 0; exhaustivement
(byte & 0xff) est exécuté comme (((int) byte) & 0x000000ff), où
évidemment le cast d'un byte en int provoque une propagation de signe si
le nombre est dans 0x80..0xFF (par exemple (int) 0x82 donne 0xffffff82).

les deux opérandes sont ici des bytes donc l'opération ne sert à rien.

Sylvain.



Avatar
Sylvain
Sylvain wrote on 04/05/2006 22:33:

3)cette instruction: "l2 = l1 & 0x3f" (l2 et l1 sont des integer)
remplie-t-elle bien l2 avec les 6 bits les plus faible de l1 (ceux
"situés à gauche") et mets les autres bits restant à 0 ? Si oui y'
a-t-il un moyen de recuperer l1 en ayant l2 ?


3Fh font, imho, 10 bits (2 + 8) pas 12.



je ne sais pas pourquoi j'ai lu 0x03ff (ni 12) ?!?
le masque appliqué ne conserve en effet que les 6 bits de poids faible.

Sylvain.