AES 암호화란? 해시와 다른 점, 256비트의 의미

어떤 문자열을 해시로 바꾸면 그 결과에서 원문으로 다시 돌아가는 길은 없습니다. 해시는 지문 같은 것이라서, "이 값이 그 값과 같은가"만 대조할 수 있을 뿐 원문을 복원하는 용도가 아닙니다. 반면 암호화는 정반대로 설계됩니다. 비밀번호만 정확히 알고 있으면, 암호문을 다시 원문 그대로 되돌릴 수 있습니다.
이 둘을 같은 개념으로 착각하면 곤란해집니다. "암호화한 텍스트를 나중에 비밀번호로 다시 풀 수 있나요"라는 질문에 해시를 떠올리며 "불가능합니다"라고 답하면 틀린 답이 됩니다. 텍스트를 암호화하는 도구가 실제로 하는 일은 정확히 그 반대, 즉 되돌릴 수 있는 변환이기 때문입니다.
요약 ① 해시는 한 방향으로만 계산되는 지문 확인용이고, 암호화는 비밀번호로 원문을 되돌릴 수 있는 양방향 변환입니다. ② "256비트"는 암호화에 쓰이는 키의 길이를 뜻하며, 이 길이가 곧 그 키를 무차별로 맞혀야 하는 경우의 수를 결정합니다. ③ 같은 텍스트와 같은 비밀번호로 암호화해도 결과가 매번 다른 이유는, 암호화할 때마다 새로 뽑는 무작위 값이 결과 안에 함께 섞여 들어가기 때문입니다.
해시와 암호화는 방향부터 다릅니다
해시 함수는 입력을 고정된 길이의 값으로 요약합니다. 이 요약값에서 입력을 역산하는 계산 경로 자체가 존재하지 않도록 설계되어 있습니다. 그래서 비밀번호를 저장할 때, 파일이 변형되지 않았는지 대조할 때처럼 "같은 것인지 확인"하는 용도로 씁니다. 누군가 해시값을 훔쳐봐도 그 값만으로 원문을 되돌릴 수는 없습니다.
암호화는 이 흐름을 뒤집습니다. 원문을 비밀번호(또는 키)를 사용해 암호문으로 바꾸고, 나중에 같은 비밀번호로 그 암호문을 원문으로 되돌리는 것이 애초의 목적입니다. 즉 암호화는 "숨기되 다시 꺼낼 수 있어야" 성립하고, 해시는 "다시 꺼낼 수 없어야" 성립합니다. 둘은 비슷하게 보이는 문자열을 만들어내지만 존재 이유 자체가 서로 반대입니다.
그래서 "텍스트를 암호화해 주세요"와 "텍스트를 해시로 바꿔 주세요"는 전혀 다른 요청입니다. 상대방에게 다시 보여줄 원문이 있어야 한다면 암호화가 필요하고, 원문을 보여줄 필요 없이 일치 여부만 확인하면 된다면 해시로 충분합니다.
"AES-GCM 256비트"가 실제로 뜻하는 것
여기서 "256비트"는 암호화에 쓰이는 키의 길이를 가리킵니다. 이 비밀번호를 그대로 키로 쓰는 것이 아니라, 비밀번호로부터 256비트 길이의 키를 만들어내고 그 키로 실제 암호화·복호화 연산을 수행합니다. 키가 길수록 그 키를 하나하나 대입해서 맞혀야 하는 경우의 수가 기하급수적으로 늘어납니다.
AES는 이 키를 이용해 데이터를 블록 단위로 뒤섞는 암호화 알고리즘의 이름이고, GCM은 그 뒤섞은 결과가 중간에 조작되지 않았는지까지 함께 검증해 주는 운영 방식입니다. 즉 "AES-GCM 256비트"라는 표현은 어떤 알고리즘으로, 얼마나 긴 키로, 어떤 방식으로 암호화했는지를 한 줄로 요약한 것입니다.
다만 키가 길다는 것과 비밀번호 자체가 안전하다는 것은 별개의 문제입니다. 키를 만드는 재료가 되는 비밀번호가 짧고 예측하기 쉬우면, 공격자는 키를 직접 대입하는 대신 그 비밀번호를 먼저 추측하려 들 수 있습니다. 그래서 비밀번호는 길고 다른 곳에서 쓰지 않는 것으로 정해야, 256비트 키 길이가 갖는 의미가 실제로 살아납니다.
같은 내용을 암호화해도 결과가 매번 다른 이유
같은 텍스트를 같은 비밀번호로 두 번 암호화해 보면, 두 결과가 서로 다르게 나옵니다. 이건 오류가 아니라 의도된 동작입니다. 암호화할 때마다 그 순간에만 쓰이는 무작위 값을 새로 뽑아서 함께 섞어 넣기 때문입니다.
이 무작위 값에는 두 가지 역할이 있습니다. 하나는 비밀번호로부터 실제 암호화 키를 만들어낼 때 함께 섞이는 값이고, 다른 하나는 같은 키로 여러 번 암호화하더라도 매번 다른 결과가 나오도록 만드는 값입니다. 이 값들은 매번 새로 생성되어 암호문 앞부분에 함께 저장되기 때문에, 복호화할 때 비밀번호만 다시 입력하면 이 값들을 그대로 꺼내 써서 원문을 복원할 수 있습니다.
이 구조 덕분에 같은 문장을 여러 번 암호화해서 주고받아도, 암호문만 놓고 봐서는 그것들이 같은 원문에서 나왔는지조차 알 수 없습니다. 매번 결과가 달라 보인다고 해서 암호화에 문제가 생긴 것이 아니라, 오히려 그 반대로 정상적으로 동작하고 있다는 신호입니다.
비밀번호 하나로 텍스트를 AES-GCM 256비트로 암호화·복호화, 브라우저 안에서만 처리되고 서버에는 저장되지 않습니다.

이 계산을 도구가 대신 처리하는 방식
텍스트 암호화 도구는 지금까지 설명한 과정을 화면 뒤에서 그대로 수행합니다. 암호화 탭에서 비밀번호와 원문을 넣고 암호화하기를 누르면, 비밀번호로부터 256비트 키를 만들어내는 무작위 값과 암호화 과정에서 쓰이는 또 다른 무작위 값을 매번 새로 뽑아 AES-GCM으로 암호화한 뒤, 그 값들과 암호문을 한 덩어리로 묶어 텍스트로 복사할 수 있는 문자열 하나로 보여줍니다.
복호화 탭에서는 그 문자열과 비밀번호를 그대로 넣으면 됩니다. 문자열 안에 함께 들어있던 무작위 값들을 꺼내 같은 방식으로 키를 다시 만들고, 그 키로 암호문을 원문으로 되돌립니다. 비밀번호가 다르거나 문자열 일부가 손상되면 복호화가 실패했다는 안내가 뜨는데, 이는 GCM 방식이 결과가 조작되었는지까지 함께 검증하기 때문입니다.
이 모든 계산은 브라우저 안에서만 이루어지고 서버로 전송되지 않으며, 입력한 비밀번호는 어디에도 저장되지 않습니다. 그만큼 비밀번호를 잊어버리면 그 어떤 방법으로도 복구할 수 없다는 뜻이기도 합니다.
정리
- 해시는 한 방향으로만 계산되는 지문 확인용이고, 암호화는 비밀번호로 원문을 되돌릴 수 있는 양방향 변환입니다. 둘은 목적이 반대입니다.
- "256비트"는 암호화에 실제로 쓰이는 키의 길이를 뜻하며, 키가 길수록 무차별로 대입해 맞혀야 하는 경우의 수가 커집니다.
- 키 길이가 길어도 그 재료가 되는 비밀번호가 짧고 예측하기 쉬우면 의미가 약해지므로, 비밀번호는 길고 고유하게 정해야 합니다.
- 같은 텍스트, 같은 비밀번호로 암호화해도 결과가 매번 다른 것은 정상이며, 매번 새로 뽑는 무작위 값이 결과 안에 함께 저장되기 때문입니다.
- 비밀번호는 저장되지 않으므로 잊어버리면 복구할 방법이 없습니다. 암호화 전에 비밀번호를 안전하게 따로 기록해 두어야 합니다.
비밀번호 하나로 텍스트를 AES-GCM 256비트로 암호화·복호화, 브라우저 안에서만 처리되고 서버에는 저장되지 않습니다.
자주 묻는 질문
해시와 암호화 중 어느 것을 써야 하나요?
원문을 나중에 다시 확인해야 한다면 암호화를 써야 합니다. 예를 들어 상대방에게 내용을 안전하게 전달한 뒤 상대가 그 내용을 다시 읽어야 하는 상황이라면 암호화가 맞습니다. 반대로 원문을 보여줄 필요 없이 "이 값이 저장해 둔 값과 같은가"만 확인하면 되는 상황, 예를 들어 비밀번호 일치 여부 확인이라면 해시로 충분하고, 오히려 원문을 되돌릴 수 없는 해시 쪽이 더 안전합니다.
비밀번호를 잊어버리면 암호문을 복구할 수 있나요?
복구할 수 없습니다. 이 도구는 입력한 비밀번호를 어디에도 저장하지 않고, 그 비밀번호로부터 매번 새로 키를 만들어 계산할 뿐입니다. 비밀번호 자체를 별도의 경로로 백업해 두지 않았다면, 암호문과 비밀번호 조합 외에는 원문으로 되돌릴 방법이 없습니다.
같은 문장을 암호화했는데 왜 결과 문자열이 매번 다른가요?
암호화할 때마다 그 순간에만 쓰이는 무작위 값을 새로 뽑아 결과에 함께 섞어 넣기 때문입니다. 이 값은 매번 달라지도록 설계되어 있고, 그 값 자체가 암호문 앞부분에 포함되어 있어서 복호화할 때는 비밀번호만 맞으면 문제없이 원문으로 돌아옵니다. 결과 문자열이 다르게 나온다고 해서 암호화가 잘못된 것은 아닙니다.
AES-GCM 256비트면 절대 뚫리지 않나요?
키 길이 자체는 무차별 대입을 사실상 무의미하게 만드는 수준이지만, 그것이 곧 "무슨 비밀번호를 써도 안전하다"는 뜻은 아닙니다. 키는 사용자가 입력한 비밀번호로부터 만들어지므로, 비밀번호가 짧거나 흔히 쓰이는 단어라면 공격자는 키를 직접 대입하는 대신 그 비밀번호부터 추측하려 들 수 있습니다. 암호화 알고리즘의 안전성과 비밀번호 자체의 안전성은 서로 다른 문제이며, 둘 다 갖춰야 실제로 의미가 있습니다.
