Red25519 签名方案

Proposal 146
已关闭
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 格式,体现了最小授权原则:每个网络参与者仅获取角色所需的信息。特别是,发布到 floodfill 的加密 LeaseSet2 不会暴露它的目的地,并且只能由事先知道目的地的人查看。但是,floodfill 仍然需要能够在发布加密 LeaseSet2 时进行身份验证,客户端还需要确保身份验证是由目的地本身执行的。

Prop123 通过盲化目的地的签名密钥实现了这一点。被盲化的密钥可用于创建可由 floodfill 验证的签名,客户端可以确信只有目的地才能创建这些签名。因此,有必要指定一种可用于盲化的签名方案。

设计

核心签名方案

本提案中描述的签名方案 Red25519 是 RedDSA 的一个实例,它是一种支持密钥重新随机化的基于 Schnorr 的签名方案。它具有以下功能:

GENERATE_PRIVATE() 返回一个均匀随机的私钥。

DERIVE_PUBLIC(sk) 返回与给定私钥相对应的公钥。

GENERATE_RANDOM() 返回一个适合重新随机化密钥对的随机标量。

RANDOMIZE_PRIVATE(sk, alpha) 使用秘密标量 alpha 重新随机化私钥。

RANDOMIZE_PUBLIC(vk, alpha) 使用秘密标量 alpha 重新随机化公钥。

SIGN(sk, m) 返回由私钥 sk 对给定消息 m 的签名。

VERIFY(vk, m, sig) 验证与公钥 vk 和消息 m 对应的签名 sig。如果签名有效,返回 true;否则返回 false。

对于给定的密钥对 (sk, vk),以下关系成立:

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

将 Ed25519 密钥转换为 Red25519

Ed25519 密钥可暂时单向转换为 Red25519 密钥,以支持重新随机化现有的 Ed25519 目的地。其他签名类型不兼容。

我们定义以下转换函数:

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 基点乘以 s 的固定基数标量乘法。

[s] A A 乘以 s 的可变基数标量乘法。

x || y 连接两个字节数组 x 和 y。

Red25519

方案 Red25519 专门化了 RedDSA,其中:

  • G := 曲线 Ed25519 形式的点群。具体而言,这意味着 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 公钥是曲线 Ed25519 形式上的点。它们被编码为 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 节步骤 1-3 中的 Ed25519 私钥推导 Ed25519 公钥时的秘密标量 s 的计算。

安全影响

重新随机化 Red25519 目的地然后使用它创建签名不会泄露任何关于目的地的信息,因为通过 RANDOMIZE_PRIVATE 生成的 Red25519 私钥的分布与通过 GENERATE_PRIVATE 生成的私钥的分布相同,并且 DERIVE_PUBLIC 是确定性的。

通过 CONVERT_ED25519_PRIVATE 将 Ed25519 私钥转换为 Red25519 不会产生相同的分布。然而,我们认为安全性降低是可以接受的,原因如下:

  • Ed25519 标量空间大约是 Red25519 标量空间的一半(大约有 2^251 个可能的 Ed25519 标量,而 L ~= 2^252 个可能的 Red25519 标量)。因此,安全性损失最多不过是大约 2 倍,即大约 1 位(因为我们可能碰巧选择了一个既是 Red25519 标量,又是有效的 Ed25519 标量)。

  • 现有的 Ed25519 目的地已经在网络上历史性地暴露,应该假设恶意的 floodfill 已经枚举过它们。

对该安全降低感到担忧的用户应使用 Red25519 作为其目的地的签名类型,而非 Ed25519。

注意,上述论点不适用于重新随机化标量 alpha;每次选择有偏见的 alpha 时,密钥的信息都会泄露,因为加法重新随机化行为类似于一次性密钥。

兼容性

支持 Red25519 的 I2P 版本将能够验证使用它签名的网络数据结构。不支持 Red25519 的 I2P 版本将把它视为未知签名,并可以丢弃该数据结构。在 Red25519 的充分部署得到实现之前,用户应该预期 Red25519 签名的数据结构的可靠性较差。

测试向量

Legend:
    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