**암호**(한자:暗號 영어:cipher 또는 cypher)는 정보를 이해할 수 없도록 암호화 하거나 다시 해독하기 위한 일련의 단계를 정의한 알고리즘이다.

코드를 통한 인코딩과 암호(cipher)를 통한 암호화(encipher)는 둘다 본래 뜻이 알 수 없게 한다는 점에서 같은 의미로 볼 수 있다. 그러나 암호학, 특히 비밀을 유지하기 위한 고전적인 암호학 관점에서는 두 개념이 서로 다르다.

코드는 일반적으로 여러 코드를 모아놓은 코드 사전을 통해 단어나 문장을 대체한다. 예를 들어 "UQJHSE"라는 코드는 "다음 장소로 이동하시오"라는 뜻으로 대체될 수 있다. 그러나 암호(cipher)는 일반 문장을 전혀 이해할 수 없는 글자들로 바꾸며, 적절한 변환 과정을 거치지 않으면 사용할 수 없는 형태가 된다.

암호(cipher)의 과정은 일반적으로 암호를 구성하고 해독하는 키(key 또는 미국 NSA에서는 cryptovariable라 부른다)라 불리는 부가적인 정보를 통해 이루어진다. 암호(cipher)를 사용하여 메시지를 암호화하려면 먼저 키를 정해야한다. 키 없이 암호를 해독하는 것은 매우 어렵다. 그러나 불가능한 것은 아니다.

현대적인 암호(cipher)는 몇 가지 방법으로 분류할 수 있다.

## 어원
이전 시대에서 "사이퍼(cipher)"는 숫자 0을 뜻하고 어원도 같았다. 중세 프랑스어 와 중세 라틴어 cifra은 모두 아랍어에서 0을 뜻하는 사파르''에서 유래되었다. 이후 사이퍼(cipher)는 10진수 또는 모든 숫자를 뜻했다. 사이퍼(cipher)라는 단어가 어떻게 암호화을 의미하게 되었는지는 많은 이론이 있다.

이브라힘 알 카디(Ibrahim Al-Kadi)는 아랍어 숫자 0인 사파르(sifr)가 유럽에서 암호화를 뜻하는 기술적인 용어로 발전했다고 결론을 내렸다.

10진법 0과 새로운 수학이 아랍 세계에서 중세 유럽으로 퍼져 나감에 따라 사파르(sifr)와 제피로스(zephyrus)라는 단어는 특권층의 지식과 비밀코드를 뜻하기 시작했고, 나아가 계산을 뜻하는 의미도 되었다. 조르주 이프라(Georges Ifrah)에 따르면, 13세기 파리에서는 '가치없는 사람'을 '계산을 못하는(cifre en algorisme)'라는 단어로도 쓰였다.

## 코드와 다른점
뜻을 숨기는 '코드'는 특별히 기술적인 상황에서 쓰는 경우가 아니라면 일반적으로 암호(cipher)를 뜻한다. 그러나 만약 기술적인 관점에서 보자면 코드와 암호(cipher)는 다를 수 있다. 코드는 보통 뜻을 가진 단위로 재구성된다. 단어나 문장이 다른 것으로 바뀌거나 길이를 줄이거나 한다.

이러한 사례로 과거 전보 교환이 상업화가 시작되면서 장거리 전보를 효율적으로 보내기 위해 문장길이를 줄일 수 있는 상용전신코드(commercial telegraph code)가 생겨났다.

일본에서는 한자를 모스부호인 전보로 보내기 위해 여러 의미를 조합해서 사용했다. '빠른 갈색 여우가 점프해서 게으른 개를 넘어갔다"라는 전보는 '빠른 갈색 狐(여우) 점프해서 過(지나다) 게으른 狗(개)'라는 한자로 바뀌었다.

반면에 암호(cipher)는 뜻이 없는 더 적은 글자 단위로 구성된다. 과거에 글자 단위로 구성하던 암호(cipher)는 현대로 오면서 비트 단위까지 더 작게 나뉘어 암호화 한다. 경우에 따라 코드와 암호(cipher)를 동시 사용하기도 하며, 보안을 더 강화한 초암호화(superencipherment)도 사용된다. 기술적인 관점에서 경우에 따라 코드와 암호(cipher)는 서로 대체할 수 있는 동의어로 쓸 수 있다.

## 유형
암호화는 다양한 방법이 있다. 과거에 사용된 알고리즘은 근대 방법과는 크게 다르며 현대 암호는 키를 하나만 사용하는지 두개를 사용하는지에 따라 작동 방식을 나눌 수 있다.

### 과거
과거 펜과 종이를 사용한 방식은 고전 암호로도 알려져 있다. ROT13과 같이 간단한 치환 암호 또는 레일펜스 암호(rail fence cipher)와 같은 전치형 암호(transposition ciphers)가 이에 해당한다. 예를 들어, "GOOD DOG"은 L을 G로, O를 P로, D를 X로 대체하여 "PLLX XLP"로 암호화 할 수 있다. 또 위치를 바꾸는 전치형 암호의 경우 "GOOD DOG"은 "DGOGDOO"로 암호화할 수 있다. 이렇게 간단한 암호는 평문-암호문을 쌍으로 비교하지 않더라도 암호가 쉽게 깨질 수 있다.

간단했던 암호(cipher)들은 비즈네르 암호와 같이 같은 문자라도 다르게 치환되는 다중 치환 암호(polyalphabetic substitution ciphers)으로 발전되었다. 예를 들어, "GOOD DOG"은 "PLSX TWF"로 암호화 될 수 있다. 여기서 O는 L,S,W 3개의 다른 문자로 바뀌었다. 펜과 종이로 암호화를 하던 시대에서는 사전에 알려진 몇 개의 문자나, 쉽게 추정할 수 있는 문자를 사용하면 다중 치환 암호도 쉽게 깨질 수 있었다. 키를 1회용(one-time pad)으로 하면 더 안전한 암호를 만들 수 있지만, 다중 치환의 키(one-time pad)는 원문 만큼 길어야 하고 종이와 펜으로는 느린 제작 시간, 전달상 보안 등 단점 역시 많았다.

20세기 초반에 이르러 전기 기계 장치를 통한 다중 치환 방식과 부가적(additive) 치환 방식을 이용한 암호가 발명되었다. 로터 기계(rotor machine)는 여러개의 로터 디스크로부터 다중 치환 문자를 생성하고 플러그보드로 다시 치환되었다. 로터 디스크와 플러그보드의 연결관계는 케이블을 통해 쉽게 변경 할 수 있다. 이러한 방법은 이전 체계 보다 훨씬 더 복잡했지만 영국에서 발명된 봄브와 같은 또 다른 기계 장치로부터 해독 되었다.

### 현대
현대 암호화 방법은 키 유형과 원본 데이터 유형에 따라 두 가지 기준으로 나눌 수 있다.

키 유형에 따라 다음과 같이 나뉜다.

DES 또는 AES와 같은 대칭 키 알고리즘은 발신자와 수신자가 미리 키를 저장하고 외부로부터 비밀로 유지해야한다. 발신자는 이 키를 통해 암호화하고 수신자도 해독에 동일한 키를 사용한다. 파이스텔 암호는 치환과 전치를 조합해서 사용한다. 대부분의 블록 암호 알고리즘은 이러한 구조를 기반으로 한다. RSA와 같은 비대칭 키 알고리즘은 공개된 키를 통해 누구나 암호를 만들 수 있지만 암호 해독은 비밀이 유지된 개인 키를 통해서만 할 수 있다.

데이터의 유형에 따라서는 다음 두 가지 유형으로 구분할 수 있다.

## 키의 크기와 취약점
암호를 깨는 데 도움이되는 정보가 전혀 없이 순수하게 수학적인 공격에는 다음 두 가지 요소가 중요하다.

키의 길이가 길수록 계산상의 난이도가 올라가기 때문에 이론적으로 알고리즘과 원하는 난이도를 결정할 때 키 길이를 결정한다.

128비트의 대칭 암호, 3072비트 키의 비대칭 암호 및 512비트의 타원 곡선 암호는 현재 모두 비슷한 난이도를 가지고 있음을 [http://www.keylength.com/ keylength.com]에서 비교할 수 있다.

클로드 섀넌은 이론적으로 암호는 키의 길이가 최소 평문만큼 길어야 하고, 키는 단 한번만 사용(one-time pad)되어야 깨질 수 없다고 증명했다.