Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ECDSA - 1 #28

Open
Brandnew-one opened this issue May 8, 2023 · 0 comments
Open

ECDSA - 1 #28

Brandnew-one opened this issue May 8, 2023 · 0 comments
Assignees
Labels

Comments

@Brandnew-one
Copy link
Owner

ECDSA

ECDSA(Elliptic Curve Digital Signature Algorithm)는 비대칭키 암호화의 한 유형으로, 타원 곡선 암호를 기반으로 한 디지털 서명 알고리즘입니다.

ECDSA 알고리즘이 어떤 방식으로 구현되어서 암호화를 하는지에 대해서는 정확히 모른다. 목표는 ECDSA를 Swift를 통해서 구현해서 이용하는데 중점을 두고 정리해보고자 한다

비대칭키 암호화, 디지털 서명 알고리즘

ECDSA 설명에서 다른 부분은 정확히 모르더라도 2개의 키워드를 통해서 어떤 메서드들이 필요한지 유추할 수 있다.

  • Private Key, Public Key Pair 생성
  • Private Key를 통한 Signature 생성
  • Public Key를 통한 Signature Validation

대칭키와 비대칭키에 대해 정리하면서 다뤘던 부분들입니다

순차적으로 하나씩 구현해보면서 간단하게 정리해보자


1) Key Pair 생성

ECDSA가 어떤 알고리즘인지 모르는데 어떻게 만드나요?

아주 다행히도 애플은 암호화를 위해 CryptoKit 프레임워크를 제공해주고 있고 사용하는 스펙에 맞게 P256, P348, P521, Curve25519를 선택하면 된다.

Untitled

(각 숫자가 의미하는건 Key Size로 이미 구현된곳과 맞춰줘야 한다. ECDSA256은 P256을 사용하면 된다)

import CryptoKit
import Foundation

final class ECDSA {
  private let privateKey: P256.Signing.PrivateKey
  private let publicKey: P256.Signing.PublicKey

  // MARK: - Generate ECDSA Key Pair
  init() {
    self.privateKey = .init()
    self.publicKey = privateKey.publicKey
  }

  func getPrivateKey() -> String {
    privateKey.derRepresentation.base64EncodedString()
  }

  func getPublicKey() -> String {
    publicKey.derRepresentation.base64EncodedString()
  }
}

코드에서 확인해야 될 부분은

  • private key를 통해서 public key를 생성할 수 있다
  • private key의 representation 종류

첫번째는 코드를 통해서 바로 확인할 수 있지만 두번째 representation의 종류는 서버나 이미 구현된 곳과 형태를 맞춰서 사용해야 한다.

처음 구현할 때 이부분에서 애를 좀 먹었는데 간단하게 종류와 특성을 확인해보자

/// Creates a P-256 private key for signing from a collection of bytes.
///
/// - Parameters:
///   - rawRepresentation: A raw representation of the key as a collection of
/// contiguous bytes.
public init<Bytes>(rawRepresentation: Bytes) throws where Bytes : ContiguousBytes

/// Creates a P-256 private key for signing from a Privacy-Enhanced Mail
/// PEM) representation.
///
/// - Parameters:
///   - pemRepresentation: A PEM representation of the key.
@available(iOS 14.0, macOS 11.0, watchOS 7.0, tvOS 14.0, *)
public init(pemRepresentation: String) throws

/// Creates a P-256 private key for signing from a Distinguished Encoding
/// Rules (DER) encoded representation.
///
/// - Parameters:
///   - derRepresentation: A DER-encoded representation of the key.
@available(iOS 14.0, macOS 11.0, watchOS 7.0, tvOS 14.0, *)
public init<Bytes>(derRepresentation: Bytes) throws where Bytes : RandomAccessCollection, Bytes.Element == UInt8

/// - Parameters:
///   - x963Representation: An ANSI x9.63 representation of the key.
public init<Bytes>(x963Representation: Bytes) throws where Bytes : ContiguousBytes

우선 종류만 보면 4가지의 Representation이 존재하고 pemRepresentation을 제외하고 나머지는 Data Type임을 알 수 있다.

1) rawRepresentation

의미 그대로 별다른 규칙없이 단순히 Data Type으로 생성하는 것을 의미한다.

서버에서 다른 Representation을 사용하고 있더라도 raw에서 변환이 가능하기 때문에 클라이언트에서 Private Key를 생성하고 저장할 때는 rawRepresentation 을 사용하는 것을 추천한다

2) pemRepresentation

pem은 텍스트 기반의 암호화 형식으로 Base64로 인코딩된 데이터를 시작과 끝에 특정한 태그를 붙여 표현한다.

pem 형식으로 public key를 생성하면 String Type으로 키가 생성되고 키의 처음과 끝에 - - -Private Key - - -와 같은 태그가 생성되는 것을 확인할 수 있다.

3) derRepresentation

Creates a P-256 private key for signing from a Distinguished Encoding

특정한 태그 및 길이정보를 포함해서 데이터를 직렬화 해서 저장한다 (사실 정확한 의미는 모르겠습니다)

사실 derRepresentation과 x963Representation이 어떤 의미를 가지는지는 모르지만 Data Type을 base64String 이나 hexString으로 변환해서 이미 구현된 부분과 길이를 비교하면 어떤 Representation을 사용하고 있는지 확인해 볼 수 있다.


ECDSA 키 생성 및 저장에 대해서 정리해보면,

  • Private Key, Public Key는 pair로 생성되며 Private Key를 통해서 Public Key를 생성할 수 있다.
  • 키 생성시 다양한 종류의 Representation이 있는데 base64String, hexString 등으로 변환해 이미 구현된 곳과 길이를 비교해서 찾을 수 있다.
  • Private Key는 보통 KeyChain을 통해서 저장하게 되는데 rawRepresentation을 통해서 다른 타입으로 변환이 가능하므로 저장은 rawRepresentation으로 한다
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant