켄싱턴 룬돌에서 발견된 에드워드 라르손(Edward Larsson)의 룬 암호. 흑자체로 섞인 문자와 피그펜 암호(Pigpen cipher)가 적혀있다. 
**암호**(한자:暗號 영어:cipher 또는 cypher)는 정보를 이해할 수 없도록 암호화 하거나 다시 해독하기 위한 일련의 단계를 정의한 알고리즘이다.

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

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

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

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

* 블록 암호 : 정보를 고정 된 단위의 크기로 묶어 처리된다.
* 스트림 암호 : 연속적으로 정보를 주고 받는 상황에서 작동한다.
* 대칭 키 암호 : 하나의 암호키로 암호화와 해독 모두 똑같이 사용된다. 따라서 암호문을 해독하기 위해서는 암호키를 전해줘야 한다.
* 비대칭 키 암호 : 암호화 암호키와 해독 암호키가 다르다. 이는 해독하기 위한 암호키를 공개하면서도 개별적인 보안성을 유지할 수 있다.

어원
--

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

* 암호화에는 숫자들이 연계된 경우가 많았다.
* 로마 숫자 체계에서 0의 개념이 없었기 때문에 매우 성가셨다. 당시 사이퍼(cipher)라고 불리던 0의 개념은 중세 유럽에서 외지인들이 사용했기 때문에, 당시 유럽인들은 매우 혼란스러워, 논쟁을 할 때 "분명하게 말해. 사이퍼 같이 터무니 없는 말 하지말고" 같은 말을 썼다. 이후 사이퍼는 뜻을 숨기거나 암호화의 뜻으로 사용되었다.
	+ 프랑스어는 chiffre는 이탈리어어 제로(zero)에서 가져왔다.
	+ 영어에서는 제로를 0으로 썼고, 사이퍼(cipher)는 사이퍼링(ciphering)이라는 컴퓨터 용어에서 가져왔다.
	+ 독일어는 ziffer(숫자)와 chiffre라는 단어를 사용했다.
	+ 네덜란드에서는 여전히 cijfer가 숫자를 나타낸다.
	+ 슬로바키아어도 cifra를 숫자 개념으로 사용한다.
	+ 보스니아, 크로아티아, 세르비아는 cifra가 숫자를 나타낸다. cifra 외에도 broj라는 단어를 사용한다.
	+ 이탈리아와 스페인 역시 cifra는 숫자를 나타낸다.
	+ 스웨덴은 siffra가 숫자를 나타낸다.
	+ 그리스는 τζίφρα(tzifra)라는 단어를 읽기 힘든 서명, 특히 한 획으로 쓰여진 서명을 나타낸다.

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

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

코드와 다른점
-------

뜻을 숨기는 '코드'는 특별히 기술적인 상황에서 쓰는 경우가 아니라면 일반적으로 암호(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와 같은 비대칭 키 알고리즘은 공개된 키를 통해 누구나 암호를 만들 수 있지만 암호 해독은 비밀이 유지된 개인 키를 통해서만 할 수 있다.

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

* 블록 암호는 고정된 크기의 단위로 데이터를 블록화 해서 암호화 한다.
* 스트림 암호는 연속적으로 데이터를 전송하면서 동시에 암호화 한다.

키의 크기와 취약점
----------

암호를 깨는 데 도움이되는 정보가 전혀 없이 순수하게 수학적인 공격에는 다음 두 가지 요소가 중요하다.

* 컴퓨팅 파워, 즉 계산에 투입될 수 있는 컴퓨터의 총 연산 능력이다. 이는 컴퓨터 한대만의 성능이 중요한 것이 아니다. 예를 들어 공격에는 한번에 여러 컴퓨터를 동시에 사용하여 무차별 대입(Brute-force search)의 성공 확률을 높일 수 있다.
* 키의 크기(key size), 메시지를 암호화하는 데 사용된 키의 크기는 클수록 무차별 대입 공격처럼 직접 키를 해독하는 것을 더 어렵게 만든다.

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

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

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