Red25519 서명 방식

Proposal 146
Closed
Author str4d
Created 2019-02-21
Last Updated 2020-08-05
Target Version 0.9.39
Implemented In 0.9.39

참고사항

네트워크 배포 및 테스트 진행 중. 사소한 수정이 있을 수 있음. 공식 사양은 specification를 참조하세요.

개요

이 제안서는 블라인드가 가능한 목적지를 만들기에 적합한 재랜덤화 가능한 서명 방식을 설명합니다. 또한 기존 Ed25519 목적지를 블라인드할 수 있으며, 그 효과가 약간 감소합니다.

동기

Proposal 123는 최소 권한 원칙을 구현한 암호화된 LeaseSet2 포맷을 정의합니다. 즉, 각 네트워크 참여자에게는 그들의 역할에 필요한 정보만 제공됩니다. 특히, 플로드필에 게시되는 암호화된 LeaseSet2는 그 목적지를 공개하지 않으며, 목적지에 대한 사전 지식이 있는 사람만 임대 정보를 볼 수 있습니다. 그러나 플로드필은 여전히 게시 시 암호화된 LeaseSet2를 인증할 수 있어야 하며, 클라이언트는 목적지 자체가 인증을 적용했는지 추가로 확인해야 합니다.

Prop123은 목적지의 서명 키를 블라인드 처리하여 이를 달성합니다. 블라인드 처리된 키는 플로드필에 의해 검증 가능한 서명을 생성하는 데 사용될 수 있으며, 클라이언트는 그 서명은 오직 그 목적지에 의해 작성되었음을 확신할 수 있습니다. 따라서 블라인드에 사용할 수 있는 서명 방식을 지정해야 합니다.

설계

핵심 서명 방식

이 제안서에서 설명하는 서명 방식인 Red25519는 RedDSA, 키 재랜덤화를 지원하는 Schnorr 기반의 서명 방식입니다. 다음과 같은 기능을 제공합니다:

GENERATE_PRIVATE() 랜덤하게 생성된 개인 키를 반환합니다.

DERIVE_PUBLIC(sk) 주어진 개인 키에 해당하는 공개 키를 반환합니다.

GENERATE_RANDOM() 키페어를 재랜덤화하기에 적합한 랜덤 스칼라를 반환합니다.

RANDOMIZE_PRIVATE(sk, alpha) 비밀 스칼라 alpha를 사용하여 개인 키를 재랜덤화합니다.

RANDOMIZE_PUBLIC(vk, alpha) 비밀 스칼라 alpha를 사용하여 공개 키를 재랜덤화합니다.

SIGN(sk, m) 주어진 메시지 m에 대한 개인 키 sk에 의한 서명을 반환합니다.

VERIFY(vk, m, sig) 메시지 m과 공개 키 vk에 대한 서명 sig을 검증합니다. 서명이 유효하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

주어진 키페어 (sk, vk)에 대해 다음과 같은 관계가 성립합니다:

RANDOMIZE_PUBLIC(vk, alpha) == DERIVE_PUBLIC(RANDOMIZE_PRIVATE(sk, alpha))

Ed25519 키를 Red25519로 변환하기

Ed25519 키는 기존 Ed25519 목적지의 재랜덤화를 지원하기 위해 일시적으로 Red25519 키로 단방향 변환될 수 있습니다. 다른 sigtypes와는 호환되지 않습니다.

다음과 같은 변환 함수를 정의합니다:

CONVERT_ED25519_PRIVATE(privkey) 주어진 Ed25519 개인 키에 해당하는 Red25519 개인 키를 반환합니다.

CONVERT_ED25519_PUBLIC(pubkey) 주어진 Ed25519 공개 키에 해당하는 Red25519 공개 키를 반환합니다.

주어진 Ed25519 키페어 (privkey, pubkey)에 대해 다음과 같은 관계가 성립합니다:

CONVERT_ED25519_PUBLIC(pubkey) == DERIVE_PUBLIC(CONVERT_ED25519_PRIVATE(privkey))

사양

정의

B RFC-8032에 명시된 Ed25519 기준점입니다.

L RFC-8032에 명시된 Ed25519의 순서 2^252 + 27742317777372353535851937790883648493입니다.

[s] B 공개점 B에 대한 고정 기준점 스칼라 곱셈입니다.

[s] A A에 대한 변수 기준점 스칼라 곱셈입니다.

x || y 두 바이트 배열 x와 y를 연결합니다.

Red25519

Red25519 방식은 다음과 같이 RedDSA를 특화합니다:

  • G := Curve25519의 에드워즈 형태 점의 그룹입니다. 특히, Red25519는 L의 소수 부분군을 사용하고, 조수 h_G는 8입니다.
  • P_G := Ed25519 기준점 B입니다.
  • l_H := 512
  • H(x) := SHA-512(“I2P_Red25519H(x)” || x)

RedDSA는 암호 연장 공격에 안전한 암호화 해시 함수로 H(x)를 인스턴스화한다고 가정합니다. SHA-512는 자체로는 이를 만족하지 않습니다. 이를 해결하기 위해 메시지가 길이에 대한 프리픽스-프리 인코딩과 함께 접두사로 추가되어야 합니다:

len_u16(M) || M

여기서 len_u16(M)는 M의 길이를 나타내는 리틀 엔디안 2바이트 표현입니다 (스칼라와 포인트의 리틀 엔디안 인코딩과 일관되도록).

메시지는 65534 바이트를 초과할 수 없습니다. 65535의 길이는 향후 확장을 위해 예약되어 있습니다.

인코딩 및 디코딩

Red25519 개인 키는 리틀 엔디안 표현으로 인코딩된 모드 L의 스칼라입니다. 스칼라의 바이트 배열과 정수 형태를 교환하기 위한 함수로 DECODE_SCALARENCODE_SCALAR를 정의합니다.

Red25519 공개 키는 Curve25519의 에드워즈 형태의 점입니다. Y-좌표의 255비트 리틀 엔디안 표현 뒤에 x-좌표의 부호를 나타내는 단일 비트로 인코딩됩니다. 이는 Ed25519와 동일한 인코딩입니다. 점의 바이트 배열 형식과 좌표 형식을 교환하기 위해 DECODE_POINTENCODE_POINT 함수를 정의합니다.

RedDSA 기능

구현의 용이함을 위해 이미 Red25519에 특화된 RedDSA 함수(및 몇 가지 도우미 함수)를 아래에 명시적으로 작성합니다. 구현자는 RedDSA의 섹션 5.4.6을 참조하여 RedDSA 함수의 일반적인 사양을 확인해야 합니다.

HStar(prefix1, prefix2, m) :=
      h = SHA-512()
      h.input("I2P_Red25519H(x)")
      h.input(prefix1)
      h.input(prefix2)

      h.input(len(m) & 0xff)
      h.input((len(m) >> 8) & 0xff)
      h.input(m)

      s = h.digest()
      return s mod L

  GENERATE_PRIVATE :=
      s = 64 random bytes
      return s mod L

  DERIVE_PUBLIC(sk) := [sk] B

  GENERATE_RANDOM :=
      s = 64 random bytes
      return s mod L

  RANDOMIZE_PRIVATE(sk, alpha) := (sk + alpha) mod L

  RANDOMIZE_PUBLIC(vk, alpha) := vk + [alpha] B

  SIGN(sk, m) :=
      T = 80 random bytes
      vkBytes = ENCODE_POINT(DERIVE_PUBLIC(sk))
      r = HStar(T, vkBytes, m)

      R = [r] B
      Rbytes = ENCODE_POINT(R)

      c = HStar(Rbytes, vkBytes, m)
      S = (r + (c * sk)) mod L

      return Rbytes || ENCODE_SCALAR(S)

  VERIFY(vk, m, sig) :=
      Rbytes = sig[0..32]
      Sbytes = sig[32..64]

      R = DECODE_POINT(Rbytes)
      if R is invalid:
          return false

      S = DECODE_SCALAR(Sbytes)
      if S >= L:
          return false

      vkBytes = ENCODE_POINT(vk)
      c = HStar(Rbytes, vkBytes, m)
      return ((-[S] B) + R + ([c] vk)).multiplyByCofactor().isIdentity()

변환 함수

CONVERT_ED25519_PRIVATE(privkey) :=
      s = SHA-512(privkey)[0..32]
      s[0] = s[0] & 248
      s[31] = (s[31] & 63) | 64
      return s

  CONVERT_ED25519_PUBLIC(pubkey) := pubkey

CONVERT_ED25519_PRIVATE의 구현은 RFC-8032의 섹션 5.1.5에 명시된 바와 같이 Ed25519 개인 키에서 Ed25519 공개 키를 유도할 때 비밀 스칼라 s를 계산하는 것과 동일합니다.

보안 implications

Red25519 목적지를 재랜덤화한 후 서명을 생성해도 목적지에 대한 정보가 누출되지 않습니다. 이는 RANDOMIZE_PRIVATE를 통해 생성된 Red25519 개인 키의 분포가 GENERATE_PRIVATE를 통해 생성된 개인 키의 분포와 동일하며, DERIVE_PUBLIC은 결정론적이기 때문입니다.

Ed25519 개인 키를 CONVERT_ED25519_PRIVATE를 통해 Red25519로 변환하는 것은 같은 분포를 결과로 하지 않습니다. 그러나 다음과 같은 이유로 이 보안 감소는 허용 가능한 것으로 간주됩니다:

  • Ed25519 스칼라의 공간은 Red25519 스칼라의 공간의 절반 정도입니다 (가용한 Ed25519 스칼라는 2^251개이고, L은 약 2^252의 Red25519 스칼라입니다). 따라서 보안 손실은 최대 약 2비트 정도, 혹은 약 1비트 정도입니다 (우연히도 동일한 Red25519 스칼라를 선택할 수 있는 가능성이 있기 때문).

  • 기존의 Ed25519 목적지는 이미 네트워크에 노출되었습니다. 악의적인 플로드필이 이미 이를 열거했을 가능성이 있습니다.

이러한 보안 감소가 염려되는 사용자들은 Ed25519 대신 Red25519를 그들의 목적지의 서명 유형으로 사용할 것을 권장합니다.

위의 주장은 재랜덤화 스칼라 알파에는 적용되지 않습니다. 바이어스된 알파가 선택될 때마다 키에 대한 정보가 노출됩니다. 이는 덧셈형 재랜덤화가 원타임 패드처럼 동작하기 때문입니다.

호환성

Red25519를 지원하는 I2P 버전은 Red25519로 서명된 네트워크 데이터 구조를 검증할 수 있습니다. Red25519를 지원하지 않는 I2P 버전은 이를 알 수 없는 서명 처리로 간주하며, 데이터 구조를 삭제할 수 있습니다. 사용자는 Red25519로 서명된 데이터 구조의 신뢰성이 충분히 배포될 때까지는 낮을 것으로 예상해야 합니다.

테스트 벡터

전설:
    edsk:  Ed25519 개인 키 (랜덤)
    edpk:  edsk에 해당하는 Ed25519 공개 키
    sk:    CONVERT_ED25519_PRIVATE(edsk)
    vk:    CONVERT_ED25519_PUBLIC(edpk)
    msg:
    sig:   SIGN(sk, msg)
    alpha: GENERATE_RANDOM()
    rsk:   RANDOMIZE_PRIVATE(sk, alpha)
    rvk:   RANDOMIZE_PUBLIC(vk, alpha)
    rsig:  SIGN(rsk, msg)

  테스트 벡터 1
    edsk:  0101010101010101010101010101010101010101010101010101010101010101
    edpk:  8a88e3dd7409f195fd52db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c
    sk:    58e86efb75fa4e2c410f46e16de9f6acae1a1703528651b69bc176c088bef36e
    vk:    8a88e3dd7409f195fd52db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c
    msg:   0202020202020202020202020202020202020202020202020202020202020202
    sig:   61f5527f4d3b46de4b2c234390370bf715ae9098907a0d191ba1b44b23a8ac1a
           6a40437a5294e9503faaf9bd2b7f2fe7ba44dec487b3185aba7ff7d7a17cd40f
    alpha: ae9ba9cbbc047c442448fca7c9f4e288a202ed520bfad0c784b792b7773cee08
    rsk:   8bb85f3c7a494a08890d7d142109c1a3501d04565d80227e2079097800fbe107
    rvk:   6fe128737b8e76fa66698a748b0dc0a89168dd8a0601c2b1c0b26835d323e9b3
    rsig:  533053074d3b44f08723aab988ede9880a001b7a684d4a98f2d1b88fabee07a5
           b5c9430c69a690321e0cb8365d7aeb6688bcbad2c0780e0c69e8a1b4a45f3001

  테스트 벡터 2
    edsk:  0202020202020202020202020202020202020202020202020202020202020202
    edpk:  8139770ea87d175f56a35466c34c7ecccb8d8a91b4ee37a25df60f5b8fc9b394
    sk:    a83c626bc9c38c8c201878ebb1d5b0b50ac40e8986c78793db1d4ef369fca14e
    vk:    8139770ea87d175f56a35466c34c7ecccb8d8a91b4ee37a25df60f5b8fc9b394
    msg:   0303030303030303030303030303030303030303030303030303030303030303
    sig:   0829e58eb5399870f009bd1f0270264e556424bda7a93fbcec99f6d9d75db46d
           5c3cb546d9947ca7c1200876c8775a90c357a2aef3d2f16388242ee1914b1a0a
    alpha: 98b615d9027e996cc2796c019d9c8beb46aa7d2b6eea2e5d98eb29eb1584c203
    rsk:   9fcfaa734852ca40b3810ebef590e138516e8cb4f4b1b6f0730978de7f806402
    rvk:   527e121090158419609e4a0d8de6f7d3271b353a8cd0b8172fe41468ea1e9177
    rsig:  9a6961f35ed264a946cd6214b2326a6e6caa426c2a61bc14367fd278e0b5fb51
           3ac065a69210a457f17d12ba8a496cfd835002691affa8efcdecae48135c090f

  테스트 벡터 3
    edsk:  0303030303030303030303030303030303030303030303030303030303030303
    edpk:  ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1
    sk:    98aebbb178a551876bfaf8e1e530dac6aaf6c2ea1c8f8406a3ab37dfb40fbc65
    vk:    ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1
    msg:   0404040404040404040404040404040404040404040404040404040404040404
    sig:   ef5fd1488048fb0247e5883bd90f7b2ce1ffe9b143a5bf6156b76ac2c39d8fdb
           d0730d7111d9cec69a808f3d18268a91f035b41b82c1fe06f394a615f93a8709
    alpha: ba17f5110fcea8a12e0bd3677e4088b874332c4e3e6c9911d9ec3fe0233d3e0a
    rsk:   c4ceed95e9208c189458fe772c9628021f2aef385bfb1d187c9877bfd84cfa0f
    rvk:   6e2b9b129bbe00fa964c996d40307dd01aff120e94fd15f17119341ecda3d7a0
    rsig:  900ecc6306f895a8ccde97d3624799fd939062a87b69e09351903ba83ceeab2b
           ef6e3c15e5d8400ed9151f7dce14bf4cfc7ce3f4399e22455fc18a68ed931c03

  테스트 벡터 4
    edsk:  0404040404040404040404040404040404040404040404040404040404040404
    edpk:  ca93ac1705187071d67b83c7ff0efe8108e8ec4530575d7726879333dbdabe7c
    sk:    483e3c145d7e680a16676925fc045183d2f510cb2f660a1fc517c73762185d43
    vk:    ca93ac1705187071d67b83c7ff0efe8108e8ec4530575d7726879333dbdabe7c
    msg:   0505050505050505050505050505050505050505050505050505050505050505
    sig:   d76b8133e08e4ff58de6b7f2df95c84a8bb968addd1d1ff585d79a90f5cfe11f
           9aa21d0277908aecae3853ee44493f95f2445df2da712f28eea435044e6fed03
    alpha: 9a14f2755512a72a3a5a514379f3458c3f912fc5eba8711b0cf2bfda49c79104
    rsk:   2e0357164904c6d4f64ddcdcfa101bbc118740901b0f7c3ad1098712acdfee07
    rvk:   de0a291ee45634de9a051c9373b9378ffbe45a8532067a9a93a86b837c762908
    rsig:  010dcc6a44e942a6f7d52704d957ad66a5c6452ad9b9442cc8ef724e41d6c3ce
           a24eace9b22e0f9d2b9ade14c61bded33286e7e6340faaa0167a9f1f90001503

  테스트 벡터 5
    edsk:  0505050505050505050505050505050505050505050505050505050505050505
    edpk:  6e7a1cdd29b0b78fd13af4c5598feff4ef2a97166e3ca6f2e4fbfccd80505bf1
    sk:    48370d6146de919cc1ce472897775d9a6c2834c509e08e14efcb2b52188f946e
    vk:    6e7a1cdd29b0b78fd13af4c5598feff4ef2a97166e3ca6f2e4fbfccd80505bf1
    msg:   0606060606060606060606060606060606060606060606060606060606060606
    sig:   2c56c96801f99ae1f5e8d8edc87725e08aaf7fc77071f222f7c46084b41c5b41
           de1ee3df97217865633f7cceb11cedc3a637ce047d2111cb6f372882e2d6b20b
    alpha: 687944d00a53ca02a0787da2acb8f99994ea7453c8d140d93efbc2b70d852a07
    rsk:   35e598a6987bdb3685fdff552d5b3ea20013a918d2b1cfed2dc7ee092614bf05
    rvk:   9951414e4f29408031f212edc6c9cfe36550b4ce2aa968db49de6c93ca9d565b
    rsig:  4b8f3e3baa8b4fdb99b0053036d569352e49c98c61800288f676aed77b9929b3
           f3278565d824c5566666d2c9ff789207098d5f9d09dd89aa4945ca3866831e02

  테스트 벡터 6
    edsk:  0606060606060606060606060606060606060606060606060606060606060606
    edpk:  8a875fff1eb38451577acd5afee405456568dd7c89e090863a0557bc7af49f17
    sk:    a83f248f80ff04de20a82fe12bd3551887168e372d239932ce812d0992d34078
    vk:    8a875fff1eb38451577acd5afee405456568dd7c89e090863a0557bc7af49f17
    msg:   0707070707070707070707070707070707070707070707070707070707070707
    sig:   f4a00093daa26b48465e07ee5697ba44191fb5673b6ab71a31d2349a18aecbd6
           c4801be60ebf18cd7ce8ec5fe0988fc4762908095063b55068ce4c7578c91504
    alpha: 0158cda553d7e9769829a5d36d2b7ce05e9171d8d058a8630d31029001ffd409
    rsk:   41f8424d01be5b9406eb179da42fda51e5a7ff0ffe7b4196dbb22f9993d21502
    rvk:   cef5dc9b4a246025df56fb118e34c3f06d6213c4c6ab8a1d4297eb7845cb2824
    rsig:  de23eec573f35ebf7ea9539b511ca5129213821525190fdf1c186c2788c1abb3
           5bd40937defbc4112225d399a79a171cf02c3eebbd6340bbdca7383906af1902

  테스트 벡터 7
    edsk:  0707070707070707070707070707070707070707070707070707070707070707
    edpk:  ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c
    sk:    28ad39fefd7fa3e200a9c626eef599e61a2d055c48a8288a4e7e4c4bca392878
    vk:    ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c
    msg:   0808080808080808080808080808080808080808080808080808080808080808
    sig:   e78bf2d340d9ae0af5dd81e4d58801b3872189a71573a12be343ed39cebab56a
           6bc1f01872bbb1d16b2be4a943a9ba90fb7a4c97c3e5f20416890ceedf6e7e0c
    alpha: 8e16161802e3c87857ae725dfa28d6222b326907f652e6c89f806882c0fb1a00
    rsk:   3bf8968b47adebf27b0d740fd2495777455f6e633efb0e53eefeb4cd8a354308
    rvk:   755a8f05633c45d0fac471a386776f63a7d28bc8d80e326ddde5484b20565e89
    rsig:  6efdca4ba705bc05d4564f0ca626646679ac1cb2c3093618e95238ebd1c7aa09
           632ccefc324594447a01074bb473c3ce94ccaae86e18f8f43477326a12ae6207

  테스트 벡터 8
    edsk:  0808080808080808080808080808080808080808080808080808080808080808
    edpk:  1398f62c6d1a457c51ba6a4b5f3dbd2f69fca93216218dc8997e416bd17d93ca
    sk:    3826c9c31226edde9501fd2589203cb3e6fe737876a845512b53ada2fa2ace74
    vk:    1398f62c6d1a457c51ba6a4b5f3dbd2f69fca93216218dc8997e416bd17d93ca
    msg:   0909090909090909090909090909090909090909090909090909090909090909
    sig:   1ed88a926dd80999d3a40efd3b74fa731729e28bb84e0430663822a69f9f4bcc
           fd2bd0aa7325d9887eac76ddf08da65c42eedaaec244c3241307570910778f05
    alpha: c4cc56d9c3e787ca60a54dfca65b4556f2dccabcac97e7a975e4efa1acb8920e
    rsk:   945371b503f5e1e843c08d0a3bad8962d8db3e3523402dfba0379d44a7e36003
    rvk:   db1730a0730ca0746a73f1880660ea5ea42f9d931760f3cdedc9cbe1c1d1b8d9
    rsig:  db60c64b61e888696ca0a7ef7adb92b784e0e6070d0435818e99788022db8e83
           81ddcc1e27f044b8c3c75044e715d870f3273a7f9cf85f1a59f4a7c95fded408

  테스트 벡터 9
    edsk:  0909090909090909090909090909090909090909090909090909090909090909
    edpk:  fd1724385aa0c75b64fb78cd602fa1d991fdebf76b13c58ed702eac835e9f618
    sk:    388fe3ab30c0aabf54acd276f3d8bbbc2b7ca4a9495d204f255bacf578c74c46
    vk:    fd1724385aa0c75b64fb78cd602fa1d991fdebf76b13c58ed702eac835e9f618
    msg:   0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a
    sig:   dd5a8c6ed9331c074ea11f65b9290900931bdf01a47f01adc75583d2a3dcfc10
           b65c77a3e992678865e7dc713295749b4dddd33fa167b96c6d6904818e4d6806
    alpha: b851f206eba78325ed5231cad059e8bd8a1e3d7f1e391058b3d9ab08d096cb03
    rsk:   3c91fe3eb2dbe484e88b25b5494b2827b69ae128689630a7d83458fe485e180a
    rvk:   601ab762eea5cd89ff34e0f661d1ca3932ba166ca67154b2e62afb85282dda81
    rsig:  5a453378fdbb22b8f037ad61d144ce006201fea0c2c1472d463617c432786dfc
           47430d27649817a7fc26296c94bf922f3863867c648ddd6709710bfa199aee02

  테스트 벡터 10
    edsk:  0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a
    edpk:  43a72e714401762df66b68c26dfbdf2682aaec9f2474eca4613e424a0fbafd3c
    sk:    0099bf92c41b5d3d309c3b074756e9707e40a9bcea229857f7cf551e8bb0fd45
    vk:    43a72e714401762df66b68c26dfbdf2682aaec9f2474eca4613e424a0fbafd3c
    msg:   0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
    sig:   c54d64d550f7690ffdd108efc49f1c25a54282825e10328630710924b354cb4c
           138a523b1ada66a8fdc8b7efcae939fd54b05552c30ca280d23199c391c5b707
    alpha: 5eebb60818299d581fa68f5fcae4c2bb398a7e10876e27994d93d555075e7d05
    rsk:   aa349f2773b8b035f6ceecda965330d9b7ca27cd7191bff044632b74920e7b0b
    rvk:   d0c5fe8f83fd42202265efff804a1527c0eb0e1cce9781cf14571cd506eeed36
    rsig:  28e96b6d4251b356e635e382ed89a37e7650d3035f98909e09a6cbe82c13e418
           fddb2106b7b527e198039da7221dae1a0227f0a4ab88f06567e8fd9238acc106