2010-05-23 4 views
0

Je dois crypter un nombre et moi et cette valeur cryptée sera donnée à un client demande une clé donc je veux minimiser le nombre de chiffres et les rendre tous imprimables. Donc, je voudrais que le résultat soit un nombre entier ou tous les caractères hexadécimaux.Algorithme de chiffrement simple à nombre (ou nombre-à-hex) qui minimise le nombre de caractères

La méthode de cryptage actuelle que j'utilise (pour les non-nombres) convertit les caractères en hexadécimal (2 chiffres hexadécimaux chacun). Cela double le nombre de caractères. J'ai également considéré juste traitant l'entrée comme hex (ainsi chaque paire de nombres est traitée comme une paire hexagonale, mais alors vous avez l'ambiguïté entre une entrée deet 123 (en décryptant que le '0' principal est perdu)

suggestions?

Répondre

0

Je me suis un simple, bidouille: Si le nombre de chiffres est impair alors je préfixe un espace réservé caractère Hex (F). Puis quand je déchiffre, si je vois cet espace réservé (F) alors je sais qu'il était un espace réservé (b/c seuls les nombres sont autorisés comme entrée à cette fonction)

1

ne pas confondre deux questions différentes. Utilisez un algorithme de cryptage sécurisé (je recommande AES-256), puis utiliser base64 encodage si la sortie doit être imprimable.

Si vous souhaitez restreindre à un autre ensemble (par exemple, lettres minuscules), utilisez la base appropriée (par exemple hexavigesimal)

+0

Bien que base64 soit "imprimable", il n'est pas vraiment "typable" manuellement, donc si l'exigence est qu'ils copient le code d'un document imprimé, base64 n'est pas le meilleur choix. –

+0

Le niveau de sécurité n'est pas critique mais le nombre de chiffres est. Je n'essaie pas de protéger le pentagone ici, j'essaie d'empêcher mamie de voler des logiciels. Grand-mère ne peut pas copier et coller et je ne veux pas qu'elle essaye de taper une clé à 16 chiffres. –

0

Si l'exigence est que vous imprimez une carte avec la "clé de licence" dessus, qu'ils doivent taper manuellement alors je pense que le cryptage des valeurs requises n'est pas la meilleure solution. Il y aura juste trop de données. Je pense qu'une meilleure solution consiste à utiliser un algorithme de hachage simple sur leur nom d'utilisateur/adresse e-mail avec lequel ils ont enregistré pour hacher le résultat à une valeur de 128 bits (16 octets), puis utiliser Base-32 pour convertir en les lettres AZ et les chiffres 2-7 (qui sortiraient à environ 26 caractères). L'avantage de Base32 est qu'il n'est pas sensible à la casse (comme la base 64 est) et vous n'obtenez pas de confusion entre "i" et "1" (etc).

+0

Je suis parvenu à simplement la clé de licence, donc c'est seulement environ 5 à 10 chiffres (tous les caractères Hex) –

0

Il semble que vous confondiez cryptage et encodage. Ce sont des préoccupations complètement distinctes. Étant donné que vous ne fournissez pas assez d'informations sur la sécurité requise pour parler de chiffrement approprié, je suppose que vous parlez d'encodage. Pour l'encodage, cela n'a pas d'importance si l'entrée est cryptée ou non. La seule différence est qu'une entrée cryptée ne peut presque certainement pas être compressée, donc toute compression doit être effectuée avant le cryptage. Pour le codage, l'approche la plus simple consiste à considérer l'entrée comme un grand nombre (vous), à choisir un ensemble de symboles et à coder le nombre comme base-N où N est la taille de l'ensemble choisi. Parce que le code résultant est destiné à l'entrée humaine, vous voudrez éviter d'avoir plusieurs caractères avec des formes similaires (1, I, E/S, O, 0, D/5, S), le choix dépend de la police utilisée .

Il est également très utile d'avoir une fonction de détection d'erreur intégrée. Un moyen simple de créer une détection d'erreur correcte consiste à ajouter quelques bits d'une bonne fonction de hachage au numéro. Par exemple (en pseudocode):

number_to_encode = input_number << 5 | MD5(input_number) & 0x1F 
encoded_string = Base32Encode(number_to_encode) 

number_to_decode = Base32Decode(encoded_string) 
output_number = number_to_decode >> 5 
checksum = number_to_decode & 0x1F 
if MD5(output_number) & 0x1F != checksum then 
    Error 

Vous pouvez faire mieux que ça si vous avez un modèle d'erreur, mais en supposant modèle d'erreur aléatoire, il est aussi bon qu'il obtient, détecter plus de 96% de toutes les erreurs, en ajoutant seulement un caractère base32.