Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

차근차근

시저 암호(Caesar Cipher) - JAVA 본문

Programming/JAVA

시저 암호(Caesar Cipher) - JAVA

오늘은뭐하지 2022. 4. 29. 00:08

# 수업 때 배운 것 정리하는 목적

 

시저 암호는 key 값을 받아 알파벳을 key 만큼 민다.

'A B C' 에 key = 3 일 때 3만큼 움직여서 'D E F'로 바꾼다.

암호문 뒤를 잘못 만들었다.. D E F G H I J 이다.

여기서 간단히 생각하면 평문을 받은 후 + key를 하면 된다.

하지만 알파벳의 경우에만 적용하므로 아스키코드가 A~Z(65~90), a~z (97~122)일 때만 적용해야 한다.

	public static String CaesarCipher(String msg, int key) {
		char[] enc = new char[msg.length()];

		for(int i=0; i<msg.length(); i++) {
			char ch = msg.charAt(i);
			if(ch >= 65 && ch <= 90) {
				ch += key;
			}else if(ch >= 97 && ch <= 122) {
				ch += key;
			}
			enc[i] = ch;
		}
		return String.valueOf(enc);
	}

그럼 이런 코드가 나오는 데 여기에서 문제가 있다.

X Y Z는 아스키코드가 90을 넘어가므로 [ \ ] 로 바뀐다.

따라서 값이 90과 122를 넘을 때 A B C로 이어질 수 있도록 -26을 해준다.

for(int i=0; i<msg.length(); i++) {
    char ch = msg.charAt(i);
    if(ch >= 65 && ch <= 90) {
        ch += key;
        if(ch > 90)
            ch -= 26;
    }else if(ch >= 97 && ch <= 122) {
        ch += key;
        if(ch > 122)
            ch -= 26;
    }
    enc[i] = ch;
}

isLowerCase() 와 isUpperCase()를 이용 할수도 있다.

public static String CaesarCipher_Short(String msg, int key) {
		char[] enc = new char[msg.length()];
		
		for(int i=0; i<msg.length(); i++) {
			char ch = msg.charAt(i);
			if(Character.isLowerCase(ch)) {
				ch = (char)((ch - 'a' + key) % 26 + 'a');
			}else if(Character.isUpperCase(ch)) {
				ch = (char)((ch - 'A' + key) % 26 + 'A');
			}
			enc[i] = ch;
		}
		
		return String.valueOf(enc);
	}

소문자일 때 ch - 'a'를 하면 0~25까지의 수로 표현된다. 여기서 key값을 더해서 25를 넘을 경우 나머지 연산을 해서 0~25안으로 표현되도록 했다.

 

다음엔 가장 많이 나온 문자가 e를 암호화 한 것으로 보고 복호화하는 알고리즘을 풀어볼까 한다.

 

Comments