2011-08-22 3 views
1

Comment puis-je coder de manière réversible (symétrique) un nom de fichier (avec ou sans chemin de répertoire, je suis OK) afin que le résultat soit également un nom de fichier valide (moins que 64 caractères [ou quelle que soit la limite est], aucun caractères amusants, idéalement pas d'espaces [mais pas une exigence], etc)?Chiffrement de manière réversible des noms de fichiers afin que le résultat soit valide

recherche sur Google ne trouve que des algorithmes de chiffrement de nom de fichier où le résultat est une longue chaîne de caractères binaires (en utilisant MIME64, la conversion à non binaire est facile, mais cela fait juste le nom de fichier plus) et/ou un non-symétrique des schémas d'enchaînement (par exemple, MD5 salé, SHA1, DES, etc.). Je ne veux pas stocker une table de hachage: je veux déchiffrer le nom de fichier avec une simple clé que j'ai mémorisée.

Mes propres tentatives avec des choses comme « mcrypt -b » a échoué aussi: la sortie (même avant de convertir en ASCII) résultant grossit très rapidement le nom du fichier et l'augmentation de la longueur de clé.

Raisonnement: Je prévois d'utiliser une "sauvegarde infinie" le service (comme Mozy, blazebackup, etc.), mais les noms de fichiers ne encrypt (fichier juste contenu). Je vais créer un répertoire qui se compose de noms de fichiers cryptés avec des liens symboliques (ou même des liens physiques) vers le fichier réel. Je vais sauvegarder seulement ce répertoire (et choisir ma propre clé privée), et j'ai les sauvegardes chiffrées par un nom de fichier et chiffrées par le contenu.

EDIT: La méthode de Petey a fonctionné comme un charme!

# "-b 512" yields "Bits has bad value 512 (too small)" 
ssh-keygen -t rsa -b 768 -f /tmp/test.rsa 
echo "thisisareallylongfilenameknightswhosayniioratleastusedto" |\ 
openssl rsautl -inkey /tmp/test.rsa -encrypt | base64 |\ 
perl -0777 -pnle 's/\//-/isg;s/\n//isg' 

donne un résultat de 130 caractères qui devrait toujours être un nom de fichier!

+0

Attendez, je ne juste Chiffrer avec ma clé privée de sorte que tout le monde w/ma clé publique peut le lire? – barrycarter

+1

C'est précisément le travail de [Format Preserving Encryption] (https://secure.wikimedia.org/wikipedia/en/wiki/Format_Preserving_Encryption). –

+0

Cela semble vraiment intéressant. Existe-t-il une implémentation Linux open-source de l'une de ces méthodes? – barrycarter

Répondre

1

Vous pouvez utiliser une paire de clés RSA pour cela. Générez une paire de clés RSA plus un certificat, puis importez-la dans votre magasin de certificats. Utilisez la clé publique pour chiffrer votre nom de fichier, puis base64 encoder le résultat. La longueur maximale du nom de fichier pour ntfs est de 255 caractères, donc une clé RSA de 1024 bits devrait suffire, si vous avez besoin de noms de fichiers plus courts, utilisez une clé de 512 bits. Lorsque vous souhaitez décrypter le nom de fichier: base64 décoder le nom de fichier chiffré, puis utilisez la clé privée pour déchiffrer le nom de fichier réel.

Vous ne savez pas s'il existe un logiciel gratuit disponible pour ce faire. Si vous ne voulez pas écrire le programme vous-même, je le ferai dans .Net pour vous (pour une somme modique;).

+0

Pourquoi utiliser RSA lorsqu'un simple algorithme symétrique est suffisant? En outre, je suis sûr que vous ne pouvez pas mémoriser une clé privée RSA :-) –

1

À quel point avez-vous besoin de votre cryptage? Vous pouvez utiliser l'un des alphabets classiques basés sur l'alphabet, tels que Vigenère qui produira une sortie strictement alphabétique, bien qu'il ne gérera pas bien les caractères non alphanumériques si vous voulez un nom de fichier valide en sortie. Le résultat aura toujours "/" et "." où ils étaient avant.

0

Si vous êtes très préoccupé par la sécurité, il est intéressant de noter que les noms de fichiers à entropie élevée peuvent recevoir plus d'attention que "file000001", ... "fileNNNNNNN". Un fichier séparé mappant du fichier NNNN au nom correct peut être chiffré séparément et stocké en double dans plusieurs emplacements. Les deux méthodes ne contiennent aucune information sur les noms de fichiers d'origine. Vous pouvez également ajouter un en-tête court à chaque fichier non crypté qui crypte le nom de fichier, en supprimant ainsi un index séparé. De plus, la possibilité de détecter les erreurs de noms de fichiers corrompus est plus facile lorsque la liste des noms est connue et dans un ordre prédéterminé.

[Affichage en CW, parce que c'est vraiment plus d'un commentaire qu'une réponse.]

+0

J'ai essayé ceci avec une carte séparée et ça devient vite moche. Si vous stockez votre carte dans sqlite3 par exemple, l'ajout d'un fichier modifie tellement la db que rsync est inutile. Je suppose que le fichier plat pourrait fonctionner ... Pour ajouter un en-tête, il faudrait alors avoir 2 copies de chaque fichier. J'espérais utiliser une symlinking intelligente pour éviter cela. – barrycarter

+0

Pour l'en-tête, vous pouvez simplement utiliser un tuyau, ala 'cat plainfile | addHeader | encrypt> encfile' où encfile peut être ce que vous voulez (par exemple, peut être renommé plus tard comme fichierNNNN) et 'decrypt encfile | writeFile' (où writeFile supprime la tête et enregistre dans un nom de fichier particulier). Certes, il s'agit d'un peu de codage supplémentaire. – Iterator

+0

OK, mais le fichier simple serait un fichier que j'utilise constamment, donc le cryptage/décryptage semble constamment inefficace. Maintenant, si quelqu'un a écrit un module FUSE pour le faire, ils peuvent avoir quelque chose. – barrycarter

Questions connexes