Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 11-05-2016 12:44:15

Cladoo
Invité

Cryptage réversible

Bonjour,

voilà mon problème : je cherche un algo à implémenter me permettant de crypter 16 caractères numériques en 9 caractères alpha numériques et le fin du fin, ces 9 caractères doivent me permettre de retomber sur les 16 premiers.

Est-ce tout simplement possible ?

Merci

#2 11-05-2016 16:39:13

Rossignol
Membre
Inscription : 19-06-2015
Messages : 290

Re : Cryptage réversible

Bonjour,

C'est possible ou impossible suivant ce que vous entendez par caractères alphanumériques.

On veut une injection de l'ensemble des mots de 16 caractères d'un alphabet de 10 lettres dans l'ensemble des mots de 9 caractères d'un alphabet de N lettres.
On a donc la condition \(10^{16} \leq N^{9}\)
$$N \geq \sqrt[9]{10^{16}}=10^{\frac{16}{9}}\approx 59,948$$

Il faut donc au moins 60 caractères alphanumériques.

Si on prend les majuscules et les dix chiffres, on obtient 36 caractères : c'est insuffisant.

Si on ajoute les lettres minuscules, on a alors 62 caractères et la condition est remplie.

Une injection évidente est la conversion des nombres écrits en base 10 vers la base 62 :


# Ce que l'on considère comme caractères alphanumériques :
# (on peut supprimer jusqu'à 2 caractères ou bien en ajouter d'autres)
alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
N = len(alphanum)

def code(num):
    """Codage de num^16 vers alphanum^9"""
    num = int(num)
    alpha = []
    while num:
        alpha.append(alphanum[num%N])
        num //= N
    alpha.extend(['A']*(9-len(alpha))) # on complète à 9 car.
    return ''.join(alpha[::-1])

def decode(alpha):
    """Décodage de alphanum^9 vers num^16"""
    num = 0
    for c in alpha:
        num = N*num + alphanum.index(c)  # Horner
    num = str(num)
    num = '0'*(16-len(num))+num        # on complète à 16 car.
    return num


print(code('1234567890123456'))   # affiche 'FojQHiLB2'

print(decode('FojQHiLB2'))        # retourne '1234567890123456'
 

J'ai programmé ça en vitesse ; on doit pouvoir faire plus élégant.

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
trente huit moins treize
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums