2017-02-23 2 views
1

J'ai ici un chiffre additif que les forces brutes testent toutes les permutations possibles du texte chiffré fixe. Cela fonctionne très bien mais je ne peux pas, pour la vie de moi, comprendre comment implémenter l'arithmétique modulaire et la formule pour le décryptage. p = ((c-key)% 26) où p est la valeur du texte en clair et c le texte chiffré dans un tableau de lettres (A = 0, B = 1, etc.)Ceasar Cipher w/arithmétique modulaire

voici le code

public class Problem1 { 

public static void main(String[] args) { 

String guess = ""; 

String ct = "UOISCXEWLOBDOX"; // ciphertext 
    int key;// key to test 
    char ch; 
    for (key = 0; key < 26; key++) { // for each key value 
     for (int i = 0; i < ct.length(); ++i) { // test char 
      ch = ct.charAt(i); 
      if (ch >= 'A' && ch <= 'Z') { 
       ch = (char) (ch - key); 
       if (ch < 'A') { 
        ch = (char) (ch + 'Z' - 'A' + 1); 
       } 
       guess += ch; 
      } else { 
       guess += ch; 
      } 
     } 

     System.out.println("key: " + key + "  " + "Decrypted Message = " + guess); 
     guess = ""; 
    } 
} 

}// main 

cE CODE eST MISE à JOUR pOUR MODULAIRE arithmatic

import java.util.*; 
import java.io.*; 
`public class AdditiveCipher { 

public static void main(String[] args) 
{ 

    String guess = ""; 
    //char pt = 'a'; 
    String cipherText = "UOISCXEWLOBDOX"; 
    int key,i,x = 0; 

    //array of characters we can use 
    char[] alphabet = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', 
      'P','Q','R','S','T','U','V','W','X','Y','Z'}; 

    //try each key on the cipher text 
    for(key = 0; key < 26; key++)//for each key 
    { 
     for(i = 0; i < cipherText.length(); i++)//for each letter 
     { 
      int pt = (cipherText.charAt(i) - key - 'A') % 26; 
      guess += (char)pt; 
     } 
     System.out.print(guess + "\n"); //display each guess 
     guess = ""; 
    }//outer for 
}//end main 
}//end AdditiveCipher.java` 

C'est ma dernière tentative après avoir essayé pendant un certain temps, il émet une tonne de boîtes. toute aide avec la logique serait appréciée, ou simplement dire ce que je fais mal

+1

BTW une fois que vous avez la bonne valeur mod-26 vous pouvez simplement faire '(char) ('A' + pt)' - l'alphabet ASCII utilisé en Java (sous-ensemble de Unicode) a les lettres assignées à codes consécutifs. OTOH ajoutant de façon répétée à un 'String' avec' + = '(ou équivalent) est inefficace; pour un programme de jouets comme celui-ci, cela n'a probablement pas d'importance, mais avant de faire un vrai travail, vous en apprendrez plus sur 'StringBuilder'. –

Répondre

2

L'implémentation de cette méthode de déchiffrement de module est plutôt simple, et se fait exactement comme vous l'avez décrit dans votre question. Tout ce que vous avez à faire est de créer votre tableau de caractères comme vous l'avez décrit (A = 0, B = 1, ...), et faites la conversion p = ((c - key) % 26) pour chaque caractère pour trouver le texte original. Au moins, voici comment cela fonctionnerait dans un monde idéal. Je suis prêt à parier que le problème que vous avez est avec les valeurs ASCII des caractères. Comme vous pouvez le voir here, la valeur 'A' est égale à l'entier 65, et les valeurs des majuscules augmentent à partir de là. Pour compenser cela, ajoutez 13 (ou 'A', comme 'A' % 26 = 13) avant d'effectuer la division de module (comme ainsi: p = ((c - key + 13) % 26)), et vous devriez être bon pour aller. Pour être clair, p est l'emplacement dans le tableau de caractères où la valeur de texte d'origine pour ce caractère est stockée, pas la valeur entière réelle du caractère déchiffré. J'espère que cela a aidé, et bonne chance avec la mise en œuvre!

+0

Juste résolu le problème, voir en bas du message. merci pour l'assistance – user3412695

+0

Java '%' n'est pas un module mathématique mais _remainder_ et diffère pour les opérandes négatifs; ici par exemple -1 mod 26 est 25 mais -1% 26 est -1. Et -1 comme un code de caractère n'est pas un caractère valide. –

+0

Ouais, j'ai réalisé ça il y a un petit moment, mais il était trop tard pour changer jusqu'à ce que je me lève. Je vais modifier le post pour rendre les maths correctes. – UnknowableIneffable

0

LA SOLUTION :::

import java.util.*; 
import java.io.*; 
public class AdditiveCipher 
{ 
public static void main(String[] args) 
{ 
    int key, x, i = 0; 
    String guess = ""; 
    String cipherText = "UOISCXEWLOBDOX"; 

    //array of characters we can use 
    char[] alphabet =  {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', 
      'P','Q','R','S','T','U','V','W','X','Y','Z'}; 

//int w = ((cipherText.charAt(7) - 15 - 'A') % 26); // supposed to equal W 
    //System.out.println(w); 
    //int y = cipherText.charAt(0); 

    //try each key on the cipher text 
    for(key = 0; key < 26; key++) 
    { 
     System.out.println("key is:" + key); 
     for(i = 0; i < cipherText.length(); i++) 
     { 

ici ... Je devais ajouter 26 avant le mod pour éviter les négatifs, aussi bien à append tout ce qui est à l'alphabet [pt] au lieu de jeter pt

int pt = (cipherText.charAt(i) - key - 'A' + 26) % 26; 
       guess += alphabet[pt];    

     } 
System.out.print(guess + "\n"); //display each guess 
     guess = ""; 
    } 
}//end main 
}//end AdditiveCipher.java