2017-02-23 3 views
1

나는 brute forces가 고정 된 암호문의 모든 가능한 순열을 테스트하는 추가적인 암호를 가지고 있습니다. 그것은 잘 작동하지만 나, 내 인생에 대한, 모듈화 산술 및 해독에 대한 수식을 구현하는 방법을 알아낼 수 없습니다. 여기서 p는 평문 값이고 c는 문자 배열 (즉, A = 0, B = 1 등)의 암호문입니다.Ceasar Cipher (모듈러 산술 포함)

여기 코드는 p = ((c - key) % 26)

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 

잠시은 상자의 톤을 출력하기위한 시도 후 내 최신 시도의 모듈 산수

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` 

에 대한 코드를 업데이트됩니다. 논리적 인 도움을 주시면 감사하겠습니다. 또는 단순히 내 잘못을 말하는 것입니다.

+1

BTW 일단 올바른 mod-26 값을 지정하면'(char) ('A'+ pt)'- Java에서 사용되는 ASCII 알파벳 (유니 코드의 하위 집합) 연속 코드. OTOH가'+ ='(또는 이와 동등한) 문자열을 반복적으로 추가하는 것은 비효율적이다; 이런 장난감 프로그램은 아마 중요하지 않지만 실제 작업을하기 전에'StringBuilder'에 대해 배우십시오. –

답변

2

이 모듈러스 해독 방법은 다소 간단하며 질문에 설명 된대로 정확하게 수행됩니다. 설명한대로 문자 배열 (A = 0, B = 1, ...)을 만들고 각 문자에 대해 p = ((c - key) % 26)의 변환을 수행하면 원본 텍스트를 찾을 수 있습니다. 적어도 이것은 이상적인 세상에서 어떻게 작동 할 것인가입니다. 캐릭터의 ASCII 값으로 당신이 가진 문제를 기꺼이 내기를 원합니다. here에서 볼 수 있듯이 'A' 값은 정수 65와 같으며 대문자 값은 거기에서 증가합니다. 이를 보완하기 위해 모듈러 분할 (예 : p = ((c - key + 13) % 26))을 수행하기 전에 13 (또는 'A', 'A' % 26 = 13)을 추가하면 좋을 것입니다. 단지, p는 해독 된 문자의 실제 정수 값이 아니라 문자의 원본 텍스트 값이 저장되는 문자 배열의 위치입니다. 이 도움이 되었기를 바랍니다. 구현과 함께 행운을 빕니다.

+0

방금 ​​문제를 해결했습니다. 게시물 하단을 참조하십시오. assystance에 대한 감사합니다. – user3412695

+0

자바 '%'는 수학적 모듈이 아니라 _remainder_이며, 음수 피연산자에 대해 다릅니다. 예를 들어 -1 mod 26은 25이지만 -1 % 26은 -1입니다. 그리고 문자 코드 -1은 유효한 문자가 아닙니다. –

+0

그래, 조금 전에 깨달았지만 일어날 때까지는 너무 늦었다. 게시물을 수정하여 수학을 올바르게 수정하겠습니다. – UnknowableIneffable

0

솔루션 ::: 바로 여기

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++) 
     { 

... I는 알파벳 [PT] 대신 PT

캐스팅에 무엇이든 APPEND에서뿐만 아니라, 부정을 방지하기 위해 모드 전에 (26)를 추가했다
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