Aller au contenu

"cryptage" d'une chaine de caractère numérique


Sujets conseillés

Posté

Bonsoir,

Je cherche une méthode qui me permettrait de réaliser ceci:

A partir d'un nombre (1, 2, 150, etc.), et grâce à cette méthode, je dois retourner une sorte de chaine de caractères noyant le poisson, de telle sorte qu'apparaitrait par exemple Ab54hWx21Q.

Cette chaine en sortie doit bien entendu être différente en fonction du nombre en entrée, et doit pouvoir, grâce à la même méthode en inverse, ressortir le nombre en entrée.

Je suis restreint dans la taille de la chaine "Ab54hWx21Q" (pas plus de 10 caractères), qui, de surcroit, ne doit contenir QUE des chiffres ou lettres (donc, exit les bases64_encode/decode, convert_uuencode/decode et autres sha1).

Auriez-vous une piste ?

Merci de vos réponses,

xpatval

Posté

B'soir !

Le nombre est borné, ou ça peut être n'importe quoi ?

De plus, est-ce que les gens savent à un moment donné l'association entre le nombre et le cryptage ? (Parce que la sécurité peut être moindre s'ils sont capables d'avoir accès à beaucoup de nombres et les cryptages associés).

Suivant ces questions, on peut imaginer plusieurs solutions de cryptage. Et puis ça dépend aussi si tu t'adresses à un public formé ou pas pour le cryptage (si tu t'adresses à des élèves ingénieurs, y'aura plus de risques d'avoir des petits malins qui tenteront de déchiffrer plutôt que si tu t'adresses à des maternelles). Et si ce public est scientifique ou pas. :)

Posté

heu...borné, c'est à dire ?

Le destinataire de la chaine "cryptée" n'est absolument pas sensé savoir à quoi elle correspond. De plus, même en tentant de "décrypter", et s'il y parvient, il ne pourra rien en faire en l'état.

xpatval

Posté

Borné, c'est-à-dire que le nombre a une limite supérieure (Par exemple si c'est un nombre compris entre 1 et 100) ou s'il peut atteindre de gros nombres, de façon aléatoire (5 430 459 099...)

Si ça reste relativement petit, tu peux très facilement noyer un nombre dans plein de caractères, et ce sans te faire remarquer (sauf si on donne l'algorithme en public, sur le Hub :))

Si ça peut être gros, ça devient plus difficile, parce que tu es limité à 10 caractères.

Je peux te proposer un petit truc, qui n'est pas digne de grands cryptologues, mais qui a le mérite d'être invisible pour toute personne qui n'est pas au courant que y'a un truc caché dedans.

Cryptage

Tu prends un nombre $aléatoire entre 0 et 15, tu le convertis en hexadécimal.

De l'autre côté, tu convertis (le nombre + $aleatoire) que tu cryptes en héxadécimal aussi, et tu comptes le nombre de caractères que ça prend.

Ensuite, tu prends des lettres au hasard, comprises entre G et Z uniquement (Je prends que des X dans l'exemple suivant).

Tu crées la chaîne :

X + $nombre_en_hexa + X(...)X + $aleatoire + X

Avec un nombre de X au milieu tel que ça fasse 10 caractères au total. ($aleatoire en prendra 1, et je te demandais pour ton nombre s'il avait une limite supérieure, justement pour savoir quelle place il prend en hexa).

Tu peux mettre des majuscules et minuscules comme tu veux, pour noyer le poiscaille.

Décryptage

Avec des substr bien placés, tu récupères l'avant dernier caractère $avantdernier, et du deuxième caractère jusqu'au moment où tu as une lettre supérieure à G ($nombrecrypte).

Ensuite tu repasses en base 10 les deux variables trouvées.

Puis tu fais la soustraction, pour récupérer le nombre de départ.

Ni vu ni connu... (ou presque)

Cette méthode te permet de crypter des nombres allant de 0 à 16^6 soit 16 777 216.

Elle peut être améliorée (mais en compliquant un peu ton algo).

Je suis désolé, ça oblige à coder, et c'est un peu porc. Mais au moins, c'est personnalisé à ton problème :)

EDIT :

Si tu penses que c'est trop compliqué, tu peux juste coller deux variables en héxadécimal, du genre:

Cryptage

$aleatoire = rand(0, 31);

$aleatoire_hexa = convert_base($aleatoire, 10, 16);

$nombre // nombre à crypter

$ajout_debut = convert_base($nombre+$aleatoire);

$cryptage = $ajout_debut.$aleatoire_hexa;

Décryptage

$aleatoire_hexa = substr($cryptage, -2);

$nombre_aleatoire = convert_base($aleatoire_hexa, 16, 10);

$ajout_debut = substr($cryptage, 0, -2);

$ajout_base10 = convert_base($ajout_debut, 16, 10);

$nombre_a_trouver = $ajout_base10 - $nombre_aleatoire;

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...