Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트 카이사르 암호(Caesar Cipher)로 문자열 암호화하기

카이사르 암호(Caesar Cipher) 알고리즘이란?

카이사르 암호는 역사상 가장 오래되고 널리 알려진 암호화 기법 중 하나로, 로마 황군 율리우스 카이사르의 이름에서 유래했습니다. 평문(plaintext)의 각 알파벳 문자를 알파벳 순서상 일정한 거리만큼 떨어진 다른 문자로 치환하는 대체 암호(substitution cipher)의 한 종류입니다.

예를 들어, 왼쪽으로 3칸 이동(shift)하는 경우 D는 A로, E는 B로 바뀌는 식입니다.

여기서는 두 개의 인수를 받는 자바스크립트 함수를 작성해야 합니다.

  • 첫 번째 인수: 암호화할 문자열
  • 두 번째 인수: 이동량(shift)

이동량은 양수 또는 음수 정수가 될 수 있으며, 양수는 오른쪽 이동, 음수는 왼쪽 이동을 의미합니다.

구현 코드

다음은 카이사르 암호를 구현한 전체 코드입니다 −

const str = 'thisIsAString';
const getMap = (legend, shift) => {
    return legend.reduce((charsMap, currentChar, charIndex) => {
        const copy = { ...charsMap };
        let ind = (charIndex + shift) % legend.length;
        if (ind < 0) {
            ind += legend.length;
        };
        copy[currentChar] = legend[ind];
        return copy;
    }, {});
};
const encrypt = (str, shift = 0) => {
    const legend = 'abcdefghijklmnopqrstuvwxyz'.split('');
    const map = getMap(legend, shift);
    return str
    .toLowerCase()
    .split('')
    .map(char => map[char] || char)
    .join('');
};
console.log(encrypt(str, 6));

코드 동작 원리

코드의 핵심 로직은 다음과 같습니다.

  1. getMap 함수: 알파벳 배열(legend)과 이동량을 받아 reduce를 사용해 각 문자의 치환 매핑 테이블을 생성합니다. 모듈로 연산(%)으로 알파벳 범위를 벗어나지 않도록 처리하고, 음수 인덱스가 나오면 배열 길이를 더해 순환 구조를 만듭니다.
  2. encrypt 함수: 입력 문자열을 모두 소문자로 변환한 뒤 한 글자씩 분리하고, 매핑 테이블에 존재하는 문자만 치환합니다. 알파벳이 아닌 문자(숫자, 특수문자 등)는 map[char] || char 덕분에 그대로 유지됩니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다 −

znoyoygyzxotm

입력 문자열 thisIsAString이 6칸 오른쪽 이동 규칙에 따라 znoyoygyzxotm으로 암호화된 것을 확인할 수 있습니다. 이동량에 음수를 전달하거나 같은 값을 반대 방향으로 이동시키면 복호화도 가능합니다.