암호화를 할 때의 키와 복호화를 할 때의 키가 같은 것을 대칭 키라고 한다. 대칭 암호화 방식은 여러 사용자 사이에 공유된 단 하나의 키를 기반으로 한다.
하나의 키로 원본 데이터를 암호화하여, 암호화한 데이터를 키를 함께 송신한다.
이를 받는 사람 역시 동봉된 동일한 키를 사용해 암호화된 데이터를 복호화한다.
대칭 키 암호 방식에서는 블록 암호 방식이나 스트림 암호 방식을 사용할 수 있다.[공개키 암호 방식과 개인키 암호 방식]공개키 암호 방식의 탈취 문제
대칭 키를 사용하게 된다면 전송 과정에서 악의적인 해커가 암호화한 데이터와 함께 키를 탈취할 수 있는 키 배송 위험 문제가 발생한다. 데이터 암호화 및 복호화에 사용하는 키를 관리하는 것이 어렵다는 것이다.
여러 사용자가 데이터를 공유하기 위해서는 이 키가 필수적으로 공유되어야 한다. 그러나 해당 키가 안전하지 않은 공간에서 공유되는 경우, 악의적인 제삼자를 통해 도난당할 위험이 있다. 허가받지 않은 제삼자가 해당 키를 가지게 된다면 해당 키를 사용한 모든 데이터의 보안에 위협이 된다.
비대칭 키 암호 방식은 대칭 키의 쉽게 탈취하여 쉬운 복호화가 가능하다는 단점을 해결하기 위한 방안으로 고안된 개념이다. 비대칭 키 암호 방식은 단일 키가 아닌 공개 키와 개인 키 2가지를 사용한다.
비대칭 키 암호 방식엔 공개 키 암호 방식과 개인 키 암호방식(공개 키 서명 방식)이 있다.
공개 키는 전송자가 정보를 암호화하는데 사용하며, 개인 키는 수신자가 데이터를 복호화하는데 사용
공개 키로 암호환 데이터는 개인 키로 복호화할 수 있어야 하기 때문에, 두 키는 알고리즘에 의해 수학적으로 연결되어 있다.
[공개키 암호 방식과 개인키 암호 방식] 개인키 암호 방식
공개 키 암호 방식(비대칭 키 암호 방식)은 기존의 대칭 키 암호 방식이 가졌던 키 배송 위험 문제를 해결하여 컴퓨터 보안을 강화하며, 데이터의 무결성을 확인하는데 사용할 수도 있다.
그러나 암호화 및 복호화의 수학적 계산이 매우 복잡하기 때문에, 대량의 데이터를 처리할 경우 오버헤드가 발생하여 속도가 느려질 수 있다.
개인 키로 암호화를 하고 공개 키로 복호화를 한다. 개인 키의 소유자가 개인 키로 데이터를 암호화를 한 뒤에 공개 키와 함께 전달하는 방식이다. 공개 키와 데이터를 받아서 해당 내용을 복호화할 수 있다. 이 방식은 데이터 보호보다, 신원 확인(보장)을 위해 사용된다.
공개 키와 개인 키는 한 쌍으로, 한쪽 키로 암호화를 했다면 다른 한쪽 키로 복호화를 할 수 있다는 특성을 활용하여, 공개 키와 한 쌍인 개인 키로 암호화했다는 것을 증명한다. 블록체인에서 이 방식은 전자 서명에 사용된다.
대칭 키 암호 방식은 비대칭 키 암호 방식에 비해 비교적 간결하기 때문에 네트워크나 CPU의 오버헤드가 적고 빠르게 작동한다.
비대칭 키 암호 방식은 대칭 키 암호 방식의 단점을 보완했으나, 많은 연산을 요구하기 때문에 속도가 느리다. 그렇기에 용량이 큰 파일을 암호문으로 처리하는 데에 한계가 있다.
그렇기 때문에 대부분의 웹 프로토콜은 대칭 암호화와 공개 키 암호 방식을 혼합하여 사용하는 디지털 봉투 라는 기술을 사용한다. 데이터를 빠른 공개 키로 암호화를 한 뒤, 암호화에 사용된 대칭키를 비대칭 키로 암호화하여 전송하는 기술이다.
대표적으로는 TLS의 암호화 프로토콜로, TLS에서는 공개 키 암호 방식을 사용해 대칭 키 암호 방식에 사용할 키를 공유한다.
두 개의 소수를 곱하여 얻어낸 계수를 사용해 공개 키와 개인 키를 생성한다. 이 방식은 아주 큰 수는 소인수분해 하는 것이 어렵다는 것에 기반을 둔 방식이다.
개인 키 * 개인키 = 공개 키
-> 개인 키와 개인 키를 곱하는 것은 아주 쉽기에, 공개 키를 유추할 수 있다.
-> 그러나 공개 키를 소인수분해하려면 엄청난 시간이 걸리게 된다. 개인 키를 유추할 수 없음
-> 공개 키를 전달하여 암호화를 하고, 개인 키를 사용하여 복호화를 할 수 있다.
비트코인의 비대칭키 알고리즘으로 유명하다. RSA보다 짧은 키의 길이와, 빠른 연산 속도를 가지지만 동일한 수준의 보안 강도를 가지고 있기 때문에 RSA의 대안으로 나왔던 알고리즘
-> 위의 RSA와 마찬가지로 유한한 시간 이내에 계산이 가능하지만, 실제로 계산하기엔 너무 큰 시간을 할애한다는 점을 중점으로 두고 있다.
타원 곡선 알고리즘
타원곡선은 y^2=x^3+ax+b를 만족하는 (x,y)점들의 집합을 의미하며, X축을 중심으로 대칭이 되는 곡선을 말한다.
그리고 타원곡선 그래프에 찍힌 임의의 점에 대한 이산 로그를 구하는 것(타원곡선 덧셈 연산)이 타원곡선 알고리즘이다. 이 암호화를 통한 경우의 수는 10^77로, 실제로 계산하기란 거의 불가능하다.
공개 키와 개인 키로 구성된 한 쌍의 키를 사용한 암호화 방식이다. 두 키는 타원곡선 알고리즘(ECDSA)을 사용하여 생성된다. 공개 키로 암호화된 데이터는 해당 개인 키로 복호화할 수 있다. 따라서 공개 키는 외부에 공개하고, 개인 키는 기밀로 유지해야 한다.
위의 그림은 공개 키로 암호화된 데이터는 암호화를 한 사용자(개인 키 소유자)만이 복호화할 수 있다. 암호화된 데이터를 다른 사람에게 보내는 경우, 해당 사용자의 공개 키로 데이터를 암호화하고, 수신자는 송신자의 개인 키로 복호화를 해야 한다. 이 방식을 사용하면 중요한 데이터를 암호화하여 승인된 사용자에게만 전달할 수 있다.
반대로 개인 키로 암호화된 데이터를 공개 키로 해독하는 방식도 있다. 이러한 방법은 중요한 데이터를 암호화하는 데에는 적합하지 않다. 공개 키는 누구에게나 공개되어 있기 때문에 누구나 쉽게 복호화를 할 수 있기 때문이다. 그러나 데이터의 내용을 숨기는 것이 아니라 디지털 서명을 하여 데이터의 무결성과 진위성을 검증해야 할 때는 개인 키로 암호화하는 방식을 사용한다.
디지털 서명
디지털 서명은 메시지나 디지털 문서의 진위성과 무결성을 검증하는데 사용하는 수학적 매커니즘이다. 디지털 서명은 디지털 통신에서 변조 및 사칭 문제를 해결하기 위한 것으로, 전자문서, 거래, 메시지의 출처, 신원 및 상태에 대한 보증을 제공할 수도 있다.
쉽게 말해 디지털 서명은 메시지나 문서에 첨부된 코드다. 이 코드는 생성된 이후부터 수신자에게 전송되기까지의 과정에서 메시지의 내용이 변조되었는지를 확인할 수 있도록 해준다.
디지털 서명의 동작 방식
디지털 서명은 크게 해싱, 서명, 검증 세 단계로 나뉜다.
1. 해싱
원본 데이터를 해싱한다. 원본 데이터의 크기는 제각기 다를 수 있지만 해싱되었을 때는 동일한 길이의 해시값을 가지게 된다.
2. 서명
공개 키 암호화 방식을 사용해 해싱된 데이터에 서명을 한다. 서명을 하는 방식은 다양하지만, 일반적으로 송신자의 개인 키로 해시값을 암호화한다. 이 암호화된 결괏값이 바로 디지털 서명
디지털 서명은 개인 키로 암호화되었기 때문에 공개 키로 복호화 할 수 있으며, 정상적으로 복호화 될 경우 원본 데이터의 해시값이 나오게 된다.
서명이 완료되면 송신자는 원본 데이터와 디지털 서명, 송신자의 공개 키를 함께 전송
3. 검증
수신자는 송신자의 공개 키를 가지고 디지털 서명을 복호화한다. 디지털 서명이 송신자의 개인 키에 의해 암호화되었다면 원본 데이터의 해시값이 나올 것이다. 또한 수신자는 워논 데이터를 해싱하여 데이터의 해시값을 구한다. 이 두 해시값을 비교하여 만약 해시값이 맞다면, 데이터가 정상적으로 송신자에 의해 서명된 것임을 확인할 수 있다.
전자 서명 과정
해시 함수는 한번 해싱했다면, 그 해싱된 값을 통해 입력값을 유추할 수 없다. 이러한 특성 때문에 해시 함수를 단방향 암호라고 부른다.
해싱은 다양한 크기의 입력값을 고정된 크기의 출력값으로 생성해 내는 과정을 의미
해시 함수는 어떠한 크기의 입력이 들어와도 동일한 크기의 출력을 뱉는 함수이다. 원본이 조금이라도 바뀌어도 결과값은 전혀 달라지며, 출력값을 통해 입력값을 유추할 수 없다.
기존의 해싱은 데이터베이스 조회, 파일분석, 데이터관리 등에 사용되어 왔다. 반면 암호 해시 함수는 메시지인증, 디지털서명 등 보안 애플리케이션에서 사용될 수 있다.
특히 암호화폐 프로토콜에서 가장 중요한 기술 중 하나로, 사용자에게 익명성을 보장하고, 트랜잭션을 하나로 연결 및 압축하며, 블록을 연결하는 동시에 그 무결성을 보장하는 역할을 한다.
공개키를 해싱한 값을 지갑 주소로 사용하여 거래를 익명화할 수 있다.
트랜잭션 기록에는 해시값으로 암호화된 지갑 주소와 송금 및 잔액을 확인할 수 있을 뿐, 해당 지갑의 주인이 누구인지 파악할 수는 없다.
입력값이 조금이라도 다르면 출력값이 변하는 해시 함수의 특성을 블록체인에서 무결성을 검증하는 경우
비트코인은 POW(작업증명)방식을 사용해 어떤 노드가 블록을 만들지 정한다. 작업증명방식은 특정 조건을 만족하는 해시값을 만족하기 위해 입력값인 논스(Nonce)를 찾아야 한다. 이를 가장 먼저 찾는 노드에게 블록을 채굴할 권한을 주며 채굴에 대한 보상으로 비트코인을 제공한다.
해시 함수는 단방향 알고리즘을 사용하고 입력값이 달라져도 아예 다른 형태로 변하기 때문에, 해싱된 값을 이용하여 기존의 값을 찾기란 매우 어렵다.
그러나 이러한 해시 함수에도 약점은 있다.
해시 함수의 특징 중 하나인 '항상 고정된 길이의 출력값'때문에 한가지 문제점이 발생한다. 서로 다른 입력값을 해시 함수에 넣었는데 동일한 출력값을 내뱉는 경우이다. 이를 해시 충돌이라 하는데 시스템에 심각한 위협이 될 수 있기 때문에 충돌은 해시 함수를 만들 때 가장 중요한 요소 중 하나로 작용한다.
이를 종합해보면 암호 해시 함수의 안전성을 평가하는 요소를 다음 세 가지로 볼 수 있다.
- 충돌 저항성
- 역상 저항성
- 제2 역상 저항성
해시함수를 이용해 만든 해시 암호화 알고리즘의 모음이다. 미국 국립표준기술연구소에서 발전시켜 오늘날 미국의 국가표준으로 자리 잡았다.
일반적인 암호화 알고리즘은 데이터를 숨기고 안전하게 전달하는 기밀성이 그 목적이지만, SHA의 목적은 데이터의 위변조가 불가능함을 보장하는 무결성이다. 실제 비트코인이나 이더리움에서 블록헤더, 디지털 서명, 공개 키에서는 데이터 무결성을 위해 SHA를 사용한다.
타원곡선 디지털서명 알고리즘은 비대칭 키 방식 중 하나인 ECC(타원곡선암호)에 디지털 서명 방식을 접목한 알고리즘이다.
디지털 서명에서는 수신자가 송신자의 공개 키를 사용해 메시지를 검증하기 위해서는 디지털 서명을 필요로 한다. 디지털 서명은 개인 키로만 생성할 수 있어야 하며, 수신자가 트랜잭션에 작성된 디지털 서명과 송신자의 공개키를 송신자의 디지털 서명인지 판별할 수 있어야 한다.
HMAC은 hash-based Message Authentication Code의 약자로, 대칭 키 암호 방식을 사용하여 디지털 서명을 구현한다. HMAC은 송신자와 수신자가 단일 키를 공유하고, 해당 단일 키와 원본 데이터를 해싱한 값과 원본 데이터를 함께 트랜잭션으로 보내 데이터의 무결성을 증명한다.
HMAC의 디지털 서명 공식은 다음과 같다.
HMAC 트랜잭션 = Hash(원본 데이터, 단일 키) + Message
공개 키 암호 방식에서는 개인 키로 원본데이터의 해시값에 서명하고, 공개 키로 이를 복호화하여 원본 데이터와 비교했지만 HMAC에서는 단일 키와 원본데이터로 만든 해시값이 서명의 역할을 한다.
PKI(공개 키 인프라)는 디지털 인증서와 공개 키를 생성, 관리, 배포, 사용, 저장 및 해지하는데 필요한 일련의 하드웨어,소프트웨어,정책,프로세스와 절차의 집합이다. PKI는 대규모 사용자 집단에서 디지털 서명 및 암호화와 같은 기술을 사용할 수 있는 기반이다. PKI의 목적은 데이터를 안전하게 전송하는 것이며, 이를 위해 시스템 및 리소스 접근 권한, 데이터 보호, 트랜잭션 무결성 및 진위성, 기밀성을 보장한다.
일반적인 디지털 서명에서는 공개 키, 서명할 메시지 및 서명이 포함되어 있으며 공개 키의 소유자가 주어진 메시지에 서명했음을 보여준다.
슈노르 서명에서는 키 집합(Key Aggregation)을 사용한다. 슈노르 서명은 서명하는 당사자의 공개 키들을 결합하여 단일한 하나의 공개 키를 구성한다. 그리고 각 당사자의 개인 키를 사용하여 해당 메시지에 서명을 할 수 있다. 또한 당사자들의 서명을 결합하여 합쳐진 단일 공개 키에 유효한 단일 서명을 구성할 수 있다.
슈노르 서명은 당사자들의 정보를 하나로 통합하기 때문에 개인 정보보호에 유리하며, 블록에 들어가는 멀티시그 공개 키들과 서명들의 크기를 일반적인 블록 크기 정도로 줄이기 때문에 블록 공간을 매우 절약하고, 검증의 속도를 빠르게 할 수 있다.