Caesar cipher에 대해 들어본 적이 있습니까? ?
Julius Caesar는 이 기술을 사용하여 적으로부터 비밀 메시지를 숨겼습니다!
Caesar 암호는 가장 원시적인 암호화 기술 중 하나입니다.
이 시스템의 기본 아이디어는 문자를 회전하는 것입니다. x개의 알파벳 위치 .
예를 들어, x = 1
, 'A'는 'B'가 되고 'C'는 'D'가 되는 식입니다.
그렇다면 이것을 코드로 어떻게 구현할까요?
당신이 물어봐서 다행입니다. 그것은 그것이 보이는 것만큼 어렵지 않다는 것이 밝혀졌습니다. 우리는 문자가 숫자(ASCII 코드)로 표시될 수 있다는 사실을 이용할 것입니다. 그러면 문자를 회전하는 작업은 두 개의 숫자를 더하기만 하면 됩니다.
자신만의 Caesar 암호 변환기 만들기
입력 문자열을 정수 배열로 변환하는 것으로 시작하겠습니다.
ascii = "test".chars.map(&:ord)
이것을 분해해 봅시다 :
문자 메서드는 문자열을 문자 배열로 분할하고 열거자를 반환합니다. 따라서 지도를 호출할 수 있습니다. 어레이에서.
map 메서드는 배열의 모든 요소를 어떤 방식으로든 변환하려는 경우에 매우 유용합니다. 지도의 반환 값 변환된 요소가 있는 또 다른 배열입니다.
참고:이 구문에는 Ruby 1.9 이상이 필요하며 다음과 동일합니다.
ascii = "test".chars.map { |c| c.ord }
모든 문자를 해당 ASCII 값으로 변환하고 싶기 때문에 ord 배열의 모든 요소에 대한 메서드입니다.
이 예에서 출력은 다음과 같습니다.
[116, 101, 115, 116]
회전 시간
훌륭합니다!
다음 단계는 원하는 회전 수를 추가하는 것입니다. 지도를 사용하여 이 작업을 수행할 수 있습니다. 다시:
shifted = ascii.map { |c| c + 5 } => [121, 106, 120, 121]
이제 숫자를 다시 문자로 바꾸고 결합하면 암호화된 문자열이 제공됩니다.
shifted.map { |c| c.chr }.join => "yjxy"
원래 문자열을 검색하려면 동일한 절차를 다시 적용하기만 하면 되지만 이번에는 왼쪽으로 이동합니다.
원래 사용했던 위치만큼 이동하는 것이 중요합니다. 그렇지 않으면 원본 데이터를 복구하지 않습니다.
최종 코드 및 대체 버전
완성된 시저 암호는 여기에서 찾을 수 있습니다.
주어진 문자열에 대해 가능한 모든 26개의 반복을 생성하고 래핑도 처리합니다(포스트의 예는 하지 않음).
Array#rotate
를 사용하는 대체 버전도 있습니다.
다음도 좋아할 수 있습니다.
Ruby 문자열 형식