2012-03-25 3 views
0

Vigenere 암호 프로그램을 만들려고하는데 암호 해독 부분에 문제가 있습니다. 재미있는 점은 코드의 암호화 부분을 작동 시키면 해독된다는 것입니다. 대부분의 경우, 그렇습니다. 그러나 하나의 작은 문제가 있습니다.암호 해독 코드 오류

프로그램에서 무엇을하려고하는지 설명해 드리겠습니다. 전체 프로그램은 사용자로부터 텍스트 파일을 가져와 핵심 단어 (문자 및 소문자 여야 함)를 가져와 개별 문자를 이동하는 것입니다 그 핵심 단어에 따라 특정 위치로 텍스트 파일의. 이 암호 해독 부분에 대해서는 한 줄만 해독하면되고 프로그램의 다른 부분은 텍스트 파일의 끝에 도달 할 때까지 해독을 계속합니다. 단순화를 위해 텍스트가 "oexl"이고 키가 "고양이"라고 가정 할 때 복호화가 작동하면 결과가 "충족"되어야하지만 내 코드는 "meeZ"로 끝납니다.

틀린, 그러나 나는 그것을 정말로 고치는 법을 정말로 모르고있다. 나는 여러 가지 방법을 시도했고, 결과는 점점 악화되었다. 코드의 문제 부분

는, I는 if 문

Character.isLetter (텍스트 2) & & line.charAt (I)> = 97 & & line.charAt (I이로 대체하는 시도) < = 122 & & 텍스트 1> = 65 & & 텍스트 1 < = 작동하지 않았다 90

.

내가 생각해내는 또 다른 아이디어는 텍스트의 원래 문자가 문자인지 확인하기 위해 처음 테스트되는 if 문입니다. 그렇다면 해당 문자가 시프트 위치만큼 빼고 그 수가 더 적 으면 97 (이것은 a에 대한 ascii 값)보다 크면 해당 숫자에 25를 더하여 z로 가져옵니다. 예를 들어. 원래 문자가 l (ascii 값 108)이고, 키가 s (ascii 값 115, ascii 값이 (97), 결과 값 18, 즉 문자가 18 위치만큼 이동해야 함)라고 가정 해 봅시다. 내가하는 일은 108 (l)에서 18을 뺀다. 나는 90을 얻는다. 그 후이 수를 97 (소문자 a의 ascii 값)과 비교한다. 90이 97보다 작으므로 프로그램에서해야 할 일은 25를 108 , 나는 133을 얻습니다. 텍스트를 이동해야하는 곳의 수인 18만큼 113을 뺀다. 나는 116을 얻는다. 이것은 t에 대한 ascii 값이다. 문제는이 코드를 구현하는 방법을 잘 모르겠습니다.

도움을 주셔서 대단히 감사합니다.

 if (Character.isLetter(line.charAt(i))){ 


     int text1 = line.charAt(i) - (key.charAt(j%(key.length()))-'a'); 

     char text2 =(char)text1; 
     String text3 = Character.toString(text2); 
     text4 += text3; 
     System.out.println(text4); 


     if (text1<= 65 || (text1 >90 && text1 <97)) { 
     text1 = text1 + 26; 
     text2 =(char)text1; 
     text3 = Character.toString(text2); 
     text4 += text3; 

     } 
     j++; 
+0

의 중복 가능성 http://stackoverflow.com/questions/9853285/vigenere-cipher-program-in : 같이 루프의 나머지를 맞지 거라고 -java) – Jeffrey

+0

나도 그랬다. 내 프로그램의 암호화 부분에서 일하고 있었다. 이것은 해독에 대한 것입니다. 대부분의 부분은 동일하지만 코드의 일부분만으로는 조금 어려움을 겪고 있습니다. – ScoutBlade

답변

1
당신의 상태는 단지 문자가 소문자이고 지금 < 인 'A'또는 대문자이고 지금 < 'A'인지 확인해야

:

if (text1 < 'A' || (text1 < 'a' && line.charAt(i) > 'a')) { 
    text1 = text1 + 26; 
    text2 = (char)text1; 
    text3 = Character.toString(text2); 
    text4 += text3; 
} 

편집 : 나는 '

for(int i = 0; i<= line.length()-1; i++) { 
    if (Character.isLetter(line.charAt(i))) { 
     int text1 = line.charAt(i) - (key.charAt(j%(key.length()))-'a'); 

     if (text1 < 'A' || (text1 < 'a' && line.charAt(i) > 'a')) { 
      text1 = text1 + 26; 
     } 
     text4 += (char)text1; 
     j++; 
    } else { 
     text4 += line.charAt(i); 
    } 
} 
[자바 Vigenere 암호 프로그램 (
+0

예, 예. 정말 고맙습니다. 이 문제가 해결되었습니다. 그러나 몇 가지 테스트를 수행하는 동안 다른 문제가 발생했습니다.나는 주변을 돌아 다닐 필요가있는 모든 편지에 대해 최종 결과가 항상 그 편지 앞에 여분의 대문자로 끝나는 것을 알아 챘다. 텍스트가 Oexl이고 키가 고양이라고 가정 해 봅시다. 결과는 Meet입니다.하지만 실제 결과는 MeeZ입니다. 따라서 문자 하나가 떨어져 있고 항상 이동해야하는 문자 앞에 대문자가 있습니다. 그리고 코드의 암호화 부분에도 똑같은 일이 일어났습니다. 감사합니다. – ScoutBlade

+0

나는 약간의 테스트를했는데 왜 돌아갈 필요가있는 캐릭터 앞에 여분의 대문자가 있었는지 알 것 같습니다. 다시 텍스트는 Oexl이고 핵심은 cats입니다. 첫 번째 if 문에서 l에 도달 할 때까지 계속 진행합니다. 이제 프로그램이 문자를 이동시키고 Z입니다. 그런 다음 프로그램은 두 번째 if 문으로 이동하여 테스트를 수행하고 Z라는 것을 확인합니다. 그런 다음 26로 text1을 추가합니다. 이 프로그램이해야 할 일은 미를 끝내기 전에 수도 Z를 버리는 것입니다. 나는 문자를 버리기위한 코드를 기억하는지 알아 내려고하고있다. – ScoutBlade

+0

@ScoutBlade 코드에 "text4 + text3"이 두 번 있습니다. if 후에는 한 번만, if에 대해서는 else의 일부로 할 수 있습니다. 하나는 26 대신 25를 추가하기 때문입니다. – fgb