[외워서 끝내는 SSL과 최소한의 암호기술] 체크섬, Hash, 대칭키, 비대칭키, 디지털 서명
들어가기 앞서
해당 글은 널널한 개발자님의 인프런 강의 '외워서 끝내는 SSL과 최소한의 암호기술'의 section 1과 section 2를 보고 공부한 내용을 정리한 글입니다.
체크섬(Checksum)
네트워크를 통해 전달된 값이 해커의 조작이나 네트워크 상에서의 유실 등을 이유로 변경되었는지 검사하는 값. 한국어로 표현하면 '검사합'이라고 한다. 형식이 단순해 데이터의 무결성을 검증하는 값으로만 기능할 뿐 보안성을 보장할 수는 없다.
메커니즘은 송신측에서 데이터를 보낼 때 체크섬을 함께 보내는데, 수신지에서 수신한 데이터를 근거로 송신자의 체크섬과 연산을 해, 송신측에서 연산한 값과 일치한지를 확인하는 것이다. 아주 단순화한 방법으로 송신지에서 전송한 데이터가 십진수 7이고 체크섬이 1인 환경에서 체크섬을 연산하는 방법이 데이터와 체크섬을 더하는 것이라면, 송신지에서 연산한 값은 8이 될 것이다. 만약, 해당 데이터와 체크섬을 수신지로 전송한 후, 수신지에서도 연산을 해 계산된 값이 송신지에서의 값 8과 일치한다면 데이터가 변조되지 않았다고 판단하는 메커니즘이다. 네트워크 전송 과정에서 데이터가 변경되어 원래 7이었던 데이터가 6으로 변조되었다면 계산값이 8이 아닌 7이 나올테니, 계산값이 일치한다면 데이터의 무결성이 입증되었다 판단할 만 하다.
실제로 체크섬을 활용하는 방법은 위에 단순화한 예시보다는 훨씬 복잡하다. 하지만 핵심은 데이터와 체크섬을 연산하고, 연산된 값 중 일부를 누락시키는 방식으로 동작한다는 것이다. 체크섬의 연산이 어떻게 이루어지는지 확인하고 싶다면 아래의 게시글을 확인해보자.
https://hojak99.tistory.com/246
해시(Hash)
해시는 Hash function의 줄임말로, 임의의 길이를 갖는 임의의 데이터를 고정된 길이의 데이터로 변환하는 방법을 의미한다. 해시의 중요한 특징 중 하나는 해시 함수를 통해 데이터를 변환하면(해시하면) 변환된 데이터를 원본 데이터로 복구할 수 없다는 것이다. 이를 '단방향'이라고 표현하는데, 메커니즘은 가령 이런 식이다. 아래의 에를 한번 살펴보자.
여기 임의의 해시 함수 f(x)가 있다. f(x)는 변수 x가 주어지면, 해당 x의 각각의 자리수를 아스키 코드로 변환해 변환된 아스키코드 값들을 10진수로 더하기 연산한다. 이후 도출된 값을 11로 나누기 연산을 해 결과값을 반환한다.
예를 들어 'hello'라는 문자열이 변수 x로 주어졌다고 가정해보자. 먼저 해시 함수는 hello를 아스키 코드로 변환해 104, 101, 108, 108, 111이라는 값을 얻는다. 다음으로 각각의 값들을 10진수로 더하기 연산한다. 그럼 104 + 101 + 108 + 108 + 111의 값인 532를 얻을 수 있다. 마지막으로 도출된 값 532를 11로 나누기 연산해 4라는 계산값을 얻는다. 즉, f(hello)는 4인 셈이다.
자, 그럼 거꾸로 4라는 결과값만을 가지고 원래의 x값인 hello을 얻을 수 있을까? 불가능하다. 해시 함수 내부에서 데이터가 변조되고 특정 데이터들이 유실되었기 때문이다. 이렇듯 해시는 데이터를 변조시 발생하는 데이터를 가지고 원래의 데이터를 추론하는 것이 불가능한 단방향 암호화 방식을 채택한다.
해시에서는 중요한 특징이 하나 있는데, 해시 과정을 통해 도출된 계산값은 입력값이 무엇이었느냐에 관계 없이 항상 같은 길이(혹은 크기)를 갖는다는 것이다. 특정 해시 함수를 통해 hello를 해시하던, hello world를 해시하던 결과값은 항상 같은 길이를 갖는다.
해시는 IT 세계에서 매우 중요하게 사용되는 메커니즘으로 데이터 무결성 확보와 관련해 IT기술 전반에서 사용된다. 해시 기술은 인증서를 검증하거나, 디지털 포렌식 혹은 디지털 서명을 하거나 비밀번호를 단방향 암호화 하는데 사용될 수 있고, 심지어는 블록체인과 같은 기술에도 사용될 수 있다.
대표적인 해시 알고리즘은 MD-5, SHA-1, SHA-128, SHA-256, SHA-384, SHA-512 등이 있다.
대칭키 암호기술
대칭키와 비대칭키는 해시와 달리 값을 변환하고, 변환된 값을 원래의 데이터로 복구할 수 있는 양방향 암호화 방식을 갖는다. 대칭키와 비대칭키는 암호화와 복호화에 사용되는 키(연산에 사용되는 값..?)가 하나인지 두개인지에 따라 달라진다. 암호화/복호화에 하나의 키를 사용한다면 대칭키 암호기술, 암호화/복호화에 서로 다른 두개의 키를 사용하면 비대칭키 암호기술이다.
- 암호화는 가능하지만 복호화는 불가능한가? 해시
- 암호화/복호화를 키 하나로 수행하는가? 대칭키
- 암호화/복호화를 서로 다른 키 두개로 수행하는가? 비대칭키
대칭키는 비대칭키에 비해 효율적이기 때문에, 반드시 비대칭키를 사용해야 하는 상황이 아니라면 대칭키를 사용하는 것이 전산 자원을 낭비하지 않는데 유리하다. 일반적으로 HTTPS에서는 비대칭키와 대칭키가 모두 사용되는데, 최초에 클라이언트와 서버가 대칭키를 주고받는 초반 과정까지만 비대칭키를 사용하고, 이후에는 대칭키를 사용한다. 이러한 이유가 대칭키가 비대칭키보다 자원 활용의 효율성이 높기 때문이다. 만약 비대칭키로 모든 HTTPS 처리를 하게 될 경우 상당량의 http 메시지를 비대칭키로 암호화/복호화 하는데 많은 자원이 소모될 것이다.
대칭키의 대표적인 알고리즘은 DES, 3DES, SEED-128, ARIA, AES-128, AES-256 등이 있다.
메커니즘은 일반적으로 비트 XOR 연산 방식을 사용하는 경우가 많은데, 가령 아래와 같다. 아래는 아스키 코드 65(알파벳 A)를 대칭키인 십진수 213(바이트로 1101 0101)로 XOR 연산하는 과정을 나타낸다.
- 알파벳 A 즉, 아스키 코드 65를 바이트로 변환하면 0100 0001 이라는 결과를 얻을 수 있다.
- 0100 0001(십진수 65)과 1101 0101(십진수 213)을 비트 XOR 연산을 한다.
- XOR 연산은 각 자리수의 연산 값들이 일치하면 0을, 일치하지 않으면 1을 반환한다.
- 0100 0001 (알파벳 A, 아스키 코드 65)
- 1101 0101 (대칭키 213)
- 1001 0100 (비트별 XOR 연산 결과)
- 계산결과는 1001 0100으로 이를 십진수로 변환하면 148이 도출된다.
- 알파벳 A의 암호화 결과는 148이다.
여기에서 눈여겨봐야 할 부분은 XOR 연산의 결과값과 대칭키를 다시 XOR 연산하면 원래의 데이터인 알파벳 A를 도출할 수 있다는 것이다. 즉, 대칭키는 하나의 키로 암호화/복호화가 모두 가능한 것이다. 물론 실제 대칭키 알고리즘이 이렇게 간단하지는 않지만, 위의 예시는 대칭키를 이해하는데 많은 도움을 준다.
비대칭키 암호기술
대칭키를 이해했다면 비대칭키를 이해하는 것은 크게 어렵지 않다. 비대칭키는 대칭키보다 조금 더 복잡하지만 서로 다른 두 개의 키로 암호화와 복호화를 진행한다는 사실을 알면 크게 어렵지는 않다.
비대칭키의 두 개의 키는 흔히 public key와 private key로 구분하고 암호화/복호화를 진행할 때는 반드시 서로 다른 키를 사용해야 한다. 만약 public key를 이용해 어떤 데이터를 암호화 했다면, 암호화 된 암호문을 복호화 하기 위해서는 private key를 이용해야 한다. 반대로 private key를 이용해 암호화를 했다면, 복호화는 public key로 진행해야 한다.
비대칭키는 PKI(Public Key Infrastructure) 기술의 근간을 이루며 대표적인 알고리즘은 RSA-2048, ECC 등이 있다.
자 대칭키 보다는 조금 더 복잡하긴 하지만 메커니즘을 한번 이해해보자. 여기 아스키 코드 65(알파벳 A)가 있다. 우리는 비대칭키를 이용해 알파벳 A를 암호화/복호화 해볼 것이다. 사용될 비대칭키 중 public key는 5, modulus 323, private key는 29이다. modulus는 public key에 함께 포함되는 정보로 해시와 마찬가지로 나머지 연산을 하는데 사용된다. 아래는 비대칭키의 작동 공식이다. 아래에서 mod는 나머지 연산을, ^는 제곱을 의미한다.
- [타겟 데이터] ^ [key] mod [modulus]
자, 아스키 코드 65를 이용해 public key로 암호화하고, private key로 복호화를 진행해 보겠다. 각각의 데이터들을 위의 공식에 넣는다. 그리고 계산을 진행한다.
암호화
- 65 ^ 5 mod 323을 계산할 것이다.
- 65 ^ 5는 1,160,290,625이다.
- 1,160,290,625 mod 323은 12이다.
- 암호화된 값은 12이다.
복호화
- 암호화된 값 12와 private key 그리고 modulus를 공식에 넣어보자.
- 12 ^ 29 mod 323을 계산할 것이다.
- 12 ^ 29는 19,781,359,483,314,150,527,412,524,285,952이다. (어마무시하게 큰 값이다.)
- 19,781,359,483,314,150,527,412,524,285,952 mod 323은 65이다.
- 복호화된 값이 아스키 코드 65, 즉 알파벳 A이다.
- 성공적으로 복호화 되었다.
비대칭키의 작동에 대한 수학적인 원리는 잘 모르겠지만, modulus를 소수로 설정하는 것이 중요하다고 한다. 서로 다른 값들이 서로 다른 연산에 의해 암호화/복호화 된다는 사실이 놀랍다. 하지만 수학적으로 검증식을 도출하고 싶지는 않다. 머리가 너무 아플 것 같다...
아무튼 위의 과정을 통해 도출할 수 있는 결론은 두 가지다.
첫 번째, 비대칭키 시스템에서는 반드시 두 개의 키가 필요하다는 것. 암호화를 하고 그냥 둘 것이라면 상관이 없겠지만 복호화를 해서 원본 데이터를 봐야 한다면 시스템이 정상적으로 동작하기 위해서는 반드시 두개의 키가 동시에 필요하다.
두 번째, A라는 아스키 코드 하나를 가지고 복호화를 진행했을 때 만난 커다란 수를 기억해보자. 앞서 대칭키 시스템을 설명할 때 대칭키가 비대칭키에 비해 효율적이라고 했는데, 그 이유가 바로 이것이다. 비대칭키는 계산 과정에 어마어마한 큰값들이 나온다. (암호화/복호화는 결국 수학적인 연산이니) 이는 연산 과정에 컴퓨터의 자원 가령 CPU에 많은 부하를 줄 수 있음을 의미한다. 따라서 대칭키와 비대칭키를 모두 사용할 수 있는 환경이라면 비대칭키 대신 대칭키를 사용하는 것이 권장된다. 비대칭키 시스템은 매우 비싼 시스템이다.
추가적으로, 비대칭키 시스템은 계산값에서 도출되는 매우 큰 값들로 인해 소위 브루트포스 공격이 불가능한데, 광컴퓨터, 양자컴퓨터 등 어마어마한 연산능력을 갖춘 컴퓨터들이 발달하게 되면 비대칭키 시스템을 브루트포스 공격해 암호체계를 무력화시킬 수 있다. 비대칭키 시스템에서 도출되는 매우 큰 값들은 곧 경우의 수를 의미하므로, 그 모든 경우의 수를 일일이 확인해 private key를 계산하고 유추할 수 있는 컴퓨터가 생긴다면 말이다.
디지털 서명
디지털 서명은 데이터의 위변조 방지, 부인방지 등을 예방하기 위해 데이터를 해시한 후, 비대칭키로 암호화/복호화 하는 기술을 말한다. 작동 원리는 아래의 캡처 화면과 같다.
보다 자세한 내용은 아래의 게시글을 확인해보자.
https://m.upbitcare.com/academy/education/blockchain/94