CS 벼락치기 - 암호화

2022-06-13

카이사르 암호화

암호화하고자 하는 내용을 알파벳별로 일정한 거리만큼 밀어서 다른 알파벳으로 치환하는 암호화 방법으로, 문자열과 정수형 키를 주면 키값만큼 알파벳을 밀어서 치환하게 된다. 이때, 소문자만으로 이루어졌다 치면 밀었을 때 a-z의 범위를 벗어나게 되면 다시 돌아오게 되는데 이걸 처리해주는게 은근히 복잡하다.

공백과 영소문자로 이루어진 문자열 암호화

각 문자에 대해 아스키코드 값을 이용해 순서를 처리하게 되는데, 암호화하고자 하는 문자열이 p, 키가 k일때 공백의 뒤에 영소문자가 있게끔 만들어줘야 하므로 문자의 아스키코드가 공백의 아스키코드일 경우 아스키코드값을 a의 아스키코드 값보다 1 적은것으로 지정해 k만큼 밀어줬을 때 알파벳의 범위가 나올 것이다. 그리고 실제로 아스키코드에 k를 더해주었는데 만약 z의 아스키코드 값보다 커지면 알파벳은 26자인데 공백까지 27자라고 하면 다시 공백의 아스키코드 값 부터 시작하기 위해 27을 빼준다. 그렇게 했을 때 아스키코드가 a의 아스키코드 값보다 1 작은, 공백으로 처리하기로 한 값이 되면 실제 공백의 아스키코드 값으로 바꿔주고, 아스키코드를 문자로 치환해준다.

공백과 영대/소문자로 이루어진 문자열 암호화

a-z -> 공백 -> A-Z 순으로 되게 해야한다. 따라서 공백을 A의 아스키코드보다 1 작은 64로 바꿔준다. 그리고 k를 더한다. 그 이후 k를 더한 값이 Z의 아스키코드 90보다 크고 a의 아스키코드 97보다 작거나, 96보다 크고 122보다 작으면서 원래 문자의 아스키코드는 91보다 작은 경우 6을 더한다. 이렇게 하는 이유는, 1^1대문자에서 소문자로 넘어가다가 90~97 구간에서 걸리는 경우 2^2소문자로 넘어왔지만 기존 문자가 소문자여서 90~97의 간격만큼 더해줘야하는 경우 그런 다음 122를 넘어가면 다시 64로 돌려보내기 위해 59를 빼준다. 그 다음 아스키코드가 64이면 실제 공백의 것으로 바꿔준다.