# 공개 키 암호화 또는 비대칭 암호화

공개 키 암호화 또는 비대칭 암호화는 한 쌍의 공개 키와 개인 키를 사용하는 암호화 시스템입니다. 암호 화폐 프로토콜의 가장 중요한 부분 중 하나이며 여러 곳에서 사용됩니다. 암호 화폐 소유자만 사용할 수 있도록 암호 화폐 지갑 생성, 암호 화폐 프로토콜인 트랜잭션 서명(디지털 서명) 핵심 구성 요소. 간단히 말해서, 암호화폐를 다른 사람에게 보내면 거래는 자신의 개인 키로 서명되고(또는 개인 키로 생성된 서명 키로) 거래는 공개 키로 확인됩니다. 따라서 해커가 개인 키를 받으면 자신에게 암호 화폐를 보낼 수 있습니다.

공개 키와 개인 키를 생성하는 두 가지 알고리즘이 있습니다. 예를 들어 [Bitcoin](http://www.biwanshequ.com/) 프로토콜은 ECDSA(Elliptic Curve Digital Signature Algorithm)를 사용합니다. 이 글에서는 rivests-shamir-adleman(RSA)에 대해 설명하고 ECDSA와 비교합니다. RSA는 가장 초기에 가장 널리 사용되는 공개 키 암호 시스템 중 하나입니다. 설립자 Ron Rivest, AdiShamir 및 Leonard Adleman의 이름을 따서 명명된 이 암호는 공개 키 암호화와 거의 동의어가 되었습니다.

## RSA 알고리즘

RSA는 modulo-n(mod n) 알고리즘을 사용하여 산술 연산을 광범위하게 사용합니다. n의 나머지는 x를 n으로 나눈 나머지입니다. 예를 들어 17이고 나머지는 5 = 2입니다. RSA는 일반적으로 세 가지 주요 부분으로 구성됩니다(때로는 공개 키 공유를 추가하는 것이 좋습니다).

* 공개 및 개인 키 생성
* 생성된 공개 키를 사용하여 데이터 암호화
* 생성된 개인 키를 사용하여 데이터 복호화

## 공개 및 개인 키 생성

RSA에 대한 공개 키와 개인 키를 생성하기 위해 Alice와 Bob(암호화에 대한 업계 표준이 된 두 가상 인물)은 다음 단계를 수행합니다.

1. 두 개의 더 큰 소수 p와 q를 선택합니다. 값이 클수록 RSA는 해독하기 어렵지만 인코딩 및 디코딩 시간은 길어집니다.
2. n = pq 및 z = (p - 1)(q - 1)을 계산합니다.
3. 1, z 또는 최대 공약수(gcd)가 1과 같고 gcd(e, z)가 1인 것 외에 공약수가 없는 n보다 작은 수 e를 선택합니다. 이 경우 e와 z는 상대적으로 소수입니다. e는 암호화에 사용됩니다.
4. ed - 1이 z로 나누어 떨어지는 수 d를 구합니다. 또 다른 방법은 z = 1의 나머지를 취하는 것입니다. d는 암호 해독에 사용됩니다.
5. Bob 또는 Alice가 세상에 제공한 공개 키는 숫자 쌍(n, e)이고 개인 키는 비밀이어야 하며 숫자 쌍(n, d)입니다.

## 생성된 공개 키를 사용하여 데이터 암호화

Alice가 m < n인 정수 m(일반 텍스트 메시지)의 "비트" 패턴으로 표시되는 메시지를 Bob에게 전달하려고 한다고 가정합니다. 암호화된 일반 텍스트 메시지 m c m ^ = e mod n 암호문 c가 Bob에게 전송됩니다. Alice는 Bob의 공개 키를 사용하여 메시지를 암호화합니다.

생성된 개인 키를 사용하여 데이터 복호화

수신된 암호문을 해독하기 위해 Bob은 자신의 개인 키(N, d)를 사용해야 하는 m = c^d mod를 계산합니다.

RSA의 보안은 숫자를 빠르게 인수분해(소인수 분해)하는 알려진 알고리즘이 없다는 사실에 의존합니다. 이 예에서 공통 값 n은 p와 q에 입력됩니다.

## RSA와 ECDSA의 비교

ECDA에서 개인 키는 무작위로 생성된 정수입니다. 비트코인 프로토콜에서는 256비트(32바이트) 정수입니다. ECDSA는 또한 동일한 알고리즘을 사용하여 다른 타원 곡선을 사용하여 공개 키를 생성할 수 있습니다. 비트코인 프로토콜은 Secp256k1을 사용합니다. RSA에서는 키(공개 키, 개인 키 및 서명)가 크고 키 생성이 느립니다.

반면에 RSA는 구현하기 쉽고 ECDSA는 구현하기 어렵습니다. 2010년 12월, Sony가 알고리즘을 올바르게 구현하지 않았기 때문에 PlayStation 3가 해킹되었습니다. 이것이 OpenSSL과 같이 이미 테스트된 라이브러리를 사용하여 ECDSA 키 쌍을 생성하는 것이 권장되는 이유입니다.

약 1년 전 저는 eccpem이라는 오픈 소스 라이브러리를 구현하고 ECDSA 키 쌍을 생성하고 OpenSSL 라이브러리를 사용하여 .pem 파일에 저장하는 GitHub를 설치했습니다.

## 결론

대부분의 암호화폐 프로토콜은 RSA 대신 ECDSA를 사용합니다. 적어도 두 가지 이유가 있습니다.

* ECDSA는 RSA보다 훨씬 적은 메모리를 사용합니다.
* ECDSA는 RSA보다 빠릅니다.
