Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

자신의 Caesar 암호 인코더를 작성하는 방법

Caesar cipher에 대해 들어본 적이 있습니까? ?

Julius Caesar는 이 기술을 사용하여 적으로부터 비밀 메시지를 숨겼습니다!

Caesar 암호는 가장 원시적인 암호화 기술 중 하나입니다.

이 시스템의 기본 아이디어는 문자를 회전하는 것입니다. x개의 알파벳 위치 .

예를 들어, x = 1 , 'A'는 'B'가 되고 'C'는 'D'가 되는 식입니다.

자신의 Caesar 암호 인코더를 작성하는 방법

그렇다면 이것을 코드로 어떻게 구현할까요?

당신이 물어봐서 다행입니다. 그것은 그것이 보이는 것만큼 어렵지 않다는 것이 밝혀졌습니다. 우리는 문자가 숫자(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 문자열 형식