시저 암호 풀기
시저 암호란, 로마의 정치가 율리우스 시저(Julius Caesar, 100-44 B.C.)가 고안한 방식으로
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 말한다.
예를 들어 'A' 를 3 만큼 이동 시키면 'D'가 되며, 'Z'를 넘었을 경우 다시 'A' 부터 시작한다.
다음은 한 범죄 단체가 위의 시저 암호 기법을 활용하여 주고 받은 암호화 메세지를 가로 챈 것이다.
국가를 수호하는 입장의 화이트 해커로 고용된 당신은 아래의 정보를 해독하여 상부에 전달해야 한다.
< HYRNPNULAYNPCMPBUHICPUNPHCHYPUG >
임의의 문자열과 이동할 알파벳을 정수 값을 하나 입력받아
입력받은 숫자만큼 한 문자 씩 이동 시킨 뒤 문자 배열에 담아
암호를 복호화(해독)하는 프로그램을 만들어 아래 메세지의 정보를 분석해보자.
** 단 암호는 대문자만 존재하며, 이동할 숫자는 26을 초과할 수 없다.
** 정보의 내용과 연관이 없는 영문자가 하나 존재한다. 복호화된 결과에서 찾아보자.
실행용 클래스 명 : test.run.Main
기능 제공 클래스 명 : test.decrypt.CaeserAlgorithm
기능 제공 메소드 명 : public void decryptCaeser()
출력 예시 :
------- OOO's 복호화 프로그램 ver 1.0 -------
문자열 입력 : FDW
이동할 알파벳 입력 : 3
------------------------------------------
원문 내용 : FDW
복호화 결과 : CAT
풀이 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.print("---------------- SOZERO's 복호화 프로그램 ver 1.0 ----------------\n\n");
Scanner sc = new Scanner(System.in);
System.out.print("문자열 입력 : ");
String userInput = sc.next();
System.out.print("이동할 알파벳 입력 : ");
int num = sc.nextInt();
// 해독된 문자열
String solved = "";
for (int i = 0; i < userInput.length(); i++) {
if ((byte)userInput.charAt(i) - num < 65) {
solved += (char)( 90 - (65 - ((byte)userInput.charAt(i) - num ))+1);
}else {
solved += (char)((byte)userInput.charAt(i) - num);
}
}
System.out.println(solved);
System.out.print("-----------------------------------------------------------");
}
}
풀이 2
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.print("---------------- OOO's 복호화 프로그램 ver 1.0 ----------------\n\n");
// 문제에 주어진 "HYRNPNULAYNPCMPBUHICPUNPHCHYPUG" 를 풀기 위한 코드
Scanner sc = new Scanner(System.in);
int num = 1;
String userInput = "HYRNPNULAYNPCMPBUHICPUNPHCHYPUG";
while(num < 26) {
String solved = "";
for (int i = 0; i < userInput.length(); i++) {
if ((byte)userInput.charAt(i) - num < 65) {
solved += (char)( 90 - (65 - ((byte)userInput.charAt(i) - num ) - 1));
}else {
solved += (char)((byte)userInput.charAt(i) - num);
}
}
System.out.println(solved.replace('V', ' ')); // 실행결과를 보면 V가 띄어쓰기 역할을 한다. 그러니 V를 ' ' 로 바꿔준다.
System.out.println();
num ++;
}
System.out.print("-----------------------------------------------------------");
}
}
- 풀이 2는 문제에 주어진 "HYRNPNULAYNPCMPBUHICPUNPHCHYPUG" 를 풀기 위한 코드이다.
- "HYRNPNULAYNPCMPBUHICPUNPHCHYPUG"를 num이 1~25일때까지를 모두 넣어서 풀었을 때 V가 띄어쓰기 역할을 한다. 그러니 V를 ' '로 바꿔준다.
반응형