Bonjour,

J’ai un projet de sécurité informatique où je possède une liste de nombre générés aléatoirement mis dans le désordre. Mon objectif est de les remettre en ordre de génération.

Je pense que la façon la plus simple pour trouver l’ordre de mes valeurs pourrait être de tenter de récupérer la seed initiale. En regardant dans quel ordre sont générées les valeurs, je pourrais alors en déduire les indices de chaque ligne et résoudre mon problème.

La fonction aléatoire en interne utilisée est (probablement) Random.nextDouble() de java dont voici le code source:
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
public double nextDouble(){
	return (((long) next(26) << 27) + next(27)) / (double) (1L << 53);
}
protected synchronized int next(int bits)
{
	seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
	return (int) (seed >>> (48 - bits));
}

En sachant que la graine a une taille 48 bits, la longueur de la séquence contient 248 possibilités au maximum. Une attaque par force brute est encore envisageable mais commence à être très longue à mettre en œuvre.

J’aimerais donc faire un algorithme un peu plus intelligent pour réduire mes temps de calculs.

En considérant qu’il existe une valeur telle que je puisse obtenir une valeur de la série et les quelques valeurs suivantes, il est possible de ramener ça à un système du style.
{
val[1] = f(seed)
val[2] = f(f(seed)
...
val[n] = f(n)(seed)
}

Néanmoins, j’ai du mal à exploiter ce système de telle manière à ce qu’il réduise vraiment la complexité de mon problème.

Avez-vous des idées d’une manière pour résoudre ce système, ou retrouver la graine de quelque manière que ce soit ?


PS: Évidemment, je compte attaquer un système destiné à l’être dans le cadre étudiant et légal.
PPS: Je suis peut-être dans le mauvais forum, si tel est le cas, merci de déplacer ce thread

Merci d’avance pour votre aide!