차근차근
시저 암호(Caesar Cipher) - JAVA 본문
# 수업 때 배운 것 정리하는 목적
시저 암호는 key 값을 받아 알파벳을 key 만큼 민다.
'A B C' 에 key = 3 일 때 3만큼 움직여서 'D E F'로 바꾼다.
여기서 간단히 생각하면 평문을 받은 후 + 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를 암호화 한 것으로 보고 복호화하는 알고리즘을 풀어볼까 한다.
'Programming > JAVA' 카테고리의 다른 글
intellij 주석 색깔 변경하는 방법 (0) | 2022.10.06 |
---|---|
선택 정렬 - 자바[JAVA] (0) | 2022.06.23 |
시저 암호 복호화 - JAVA( + 많은 알파벳 찾기) (0) | 2022.04.29 |
Comments