2010-04-26 5 views
3

Je reçois régulièrement des fichiers PDF encodés. L'encodage fonctionne comme ceci:algorithme de décodage voulu

  • les fichiers PDF peuvent être affichés correctement dans Acrobat Reader
  • tout sélectionner et copier le test via Acrobat Reader
  • et coller dans un éditeur de texte
  • montrera que le contenu sont codés

donc, les exemples sont les suivants:

13579 -> 3579; 
hello -> jgnnq 

C'est essentiellement un décalage (peut-être un échange) de caractères ASCII.

La question est comment puis-je trouver le décalage automatiquement quand j'ai accès à seulement quelques échantillons. Je ne peux pas être sûr que le décalage de codage est changé. Tout ce que je sais, c'est que certains textes apparaissent habituellement (si ce n'est pas toujours), par ex. "Nom:", "Résumé:", "Total:", dans le PDF.

Merci!

modifier: merci pour les commentaires. Je vais essayer de casser la question dans les questions plus petites:

Partie 1: How to detect identical part(s) inside string?

+0

Je viens de corriger "13579 -> 3579;" J'espère que ce que vous voyez est ce que vous vouliez dire. – zaf

+0

il ya un tas de logiciels gratuits qui font cela, cherchez-vous un tel programme ou essayez-vous d'en écrire un vous-même? –

+0

@zaf Je crois, '3579;' est correct. pas '13579;', '9' + 2 est ';' effectivement – YOU

Répondre

5

Vous devez force brute elle.

Si ces modèles sont simples comme +2 code de caractère comme dans vos exemples (qui est +2 codes char)

h i j 
e f g 
l m n 
l m n 
o p q 

1 2 3 
3 4 5 
5 6 7 
7 8 9 
9 : ; 

Vous pouvez facilement mettre en œuvre comme celui-ci pour vérifier contre les mots de knowns

>>> text='jgnnq' 
>>> knowns=['hello', '13579'] 
>>> 
>>> for i in range(-5,+5): #check -5 to +5 char code range 
...  rot=''.join(chr(ord(j)+i) for j in text) 
...  for x in knowns: 
...   if x in rot: 
...    print rot 
... 
hello 
+0

+1: la force brute est tout à fait appropriée lorsque vous avez des méthodes de cryptage et un berceau limités. Ce n'est pas Enigma. Vous pouvez trouver que le manque d'échantillon est un problème, mais une fois que vous avez cassé un cryptage, le reste devrait tomber facilement. –

1

Hmmm, c'est un dur. La seule chose que je peux suggérer est l'utilisation d'un dictionnaire (avec quelques algorithmes de chiffrement de substitution) peut aider à décoder une partie du texte.

Mais je ne peux pas voir une solution qui décodera tout pour vous avec le scénario que vous décrivez. Pourquoi ne collez-vous pas un exemple d'entrée et nous pouvons avoir le décodage il y a quelques instants.

+0

@zaf, désolé que je ne peux pas coller les données réelles ici car il contient des données personnelles. Je suis tout à fait sûr que l'encodage est au moyen d'une addition ASCII ou d'un échange de caractères ASCII. – ohho

+0

OK. Vous devrez tester l'idée du dictionnaire avec les idées de décodage simples que vous avez et voir si vous pouvez extraire plus d'informations. – zaf

0

Les fichiers encodés s'ouvrent-ils correctement dans les lecteurs PDF autres qu'Acrobat Reader? Si tel est le cas, vous pouvez simplement utiliser une bibliothèque PDF (par exemple PDF Clown) et l'utiliser pour extraire par programmation le texte dont vous avez besoin.

+0

Je peux extraire du texte (sous forme codée) comme Acrobat Reader, par pdfminer (un outil pdf python) – ohho

1

C'est seulement possible alors vous avez beaucoup d'exemples (les exemples comptent alors les arrêts: possible d'obtenir toutes les combinaisons ou juste une dépendance de valeurs linéaires ou une idée du scénario).

aussi cette question: How would I reverse engineer a cryptographic algorithm? ont quelques recommandations.

3

Le PDF contiendra-t-il un texte symbolique (comme les mathématiques ou les épreuves) ou un texte en langage naturel (anglais, français, etc.)?Si ce dernier, vous pouvez utiliser un tableau de fréquences pour les lettres (digrammes, trigraphes et un petit dictionnaire de mots si vous voulez aller la distance). Je pense qu'il y en a probablement quelques unes en ligne. Here's un début. Et plus précisément letter frequencies. Ensuite, si vous êtes sûr que c'est un changement César, vous pouvez saisir les premiers 1000 caractères et les déplacer vers l'avant en augmentant les montants jusqu'à (je suppose) 127 ou plus. Prenez les textes qui en résultent et calculez à quel point les fréquences correspondent aux moyennes que vous avez trouvées ci-dessus. Here est une information à ce sujet. La page des fréquences de lettres liées de Wikipédia ne montre que des lettres, vous pouvez donc vouloir les exclure de votre calcul, ou mieux y trouver un graphique. Vous pouvez également transformer l'ensemble du texte résultant en minuscules ou en majuscules (de préférence) pour traiter les lettres de la même manière, quel que soit le cas.

Modifier - a vu un commentaire sur le caractère échange

Dans ce cas, il est un algorithme de chiffrement de substitution, qui peut encore être rompu automatiquement, mais cette fois, vous voudrez probablement avoir un tableau digraph pratique pour effectuer des analyses supplémentaires . Ceci est utile car il y aura probablement une substitution qui est "plus proche" du langage moyen en termes d'analyse de lettre que la bonne, mais en comparant les fréquences du graphique, vous pourrez l'exclure.

En outre, j'ai suggéré de déplacer les caractères, puis de voir à quel point les fréquences correspondaient aux fréquences moyennes des langues. Vous pouvez d'abord simplement calculer les fréquences dans votre texte chiffré, puis essayer de les aligner avec les bonnes valeurs. Je ne suis pas sûr de ce qui est le mieux.

+0

jusqu'à présent, les échantillons que je peux obtenir sont des ASCII lisibles (c'est-à-dire que chaque caractère lisible dans Acrobat est codé dans un autre caractère ASCII lisible) – ohho

+0

Oh, c'est parfait alors. Donc, vous avez une limite supérieure sur la longueur de décalage (même si je ne suis pas sûr - font-ils un effort pour passer 128-255 en enveloppant 128 à 0?). Si j'étais à la maison, je pourrais ouvrir mon ancien programme Matlab du collège (je pense que je l'ai toujours) et vous montrer les calculs impliqués. J'ai fait un programme juste comme celui que vous demandez dans le cadre d'un cours de crypto – Phil

+0

oui, quand j'ai essayé de le résoudre, j'ai le sentiment de faire un devoir d'université ;-) – ohho