当表示一个签名方案时,其中:
- 是密钥生成算法。
- 是签名算法。
- 是验证算法。
:接受素数大小为 sz(以比特为单位)和整数(表示每个数据集中加密的消息数量上限)作为输入。算法计算安全的私钥 sk 和公钥 pk 参数,步骤如下:
- 从大小为 的四个(安全的)素数 中选择,使得 和 ,同时满足 ,其中 表示欧拉函数。
- 生成群元素 和 ,其阶为 。
- 选择哈希函数 。
- 最后,运行 以获取安全的私钥和签名密钥 。返回密钥对 ,其中 ,而 。
是一个概率算法,它接受秘密参数 、消息 、数据集标识符 和索引 作为输入,用于计算包含带有验证标记的消息的加密后的密文 。
具体步骤如下:
- 计算消息 的 Paillier 加密 。
- 取 $R = H(\tau || i) $,其中 是哈希函数。
- 计算出元组 ,使得 $g^{a}b^{N_{E}} \equiv CR \pmod {N_{E}^{2}} $,其中 是生成群元素。
- 如果 是第一次使用,选择一个长度为 的尚未使用的素数 ,满足 ,计算其逆 和签名 ,并将 存储在列表 中。否则,从列表 中取出 。
- 从 中随机均匀选择一个元素 ,并使用 和 计算 ,使得 $x^{eN_E} \equiv g^{s}0h_i g^{a}{1} \pmod{N_S} $。
- 返回 ,其中 是验证标记。
这个算法的主要目的是将消息 加密为一个密文,并在密文中附加了用于验证正确性的标记 。
: 接受公钥 、数据集标识符 、线性函数 和 个密文 作为输入。输出是一个密文 。这一步的目的是对给定的一组密文进行验证和线性函数的评估,并生成一个新的密文作为输出。
该算法首先执行一系列检查:
- 检查是否存在索引 使得 ,或者签名的验证 成立。
- 检查是否有两个索引 使得 。
如果其中一项检查为真,则该算法将中止。否则:
- 设置 并在密文上评估线性函数 。
- 计算新的密文 。
- 通过对标签进行评估以获得新的标签 ,计算如下:
- 返回密文 。
: 接受公钥 、数据集标识符 、密文 以及线性函数 作为输入,用于检测密文 是否为有效或无效。为达到此目的,算法检查以下条件:
如果所有检查都通过,算法输出1(即 是一个有效的密文),否则输出0(即 是一个无效的密文)。
: 接受秘密参数 、数据集标识符 、密文 以及线性函数 作为输入,用于计算密文 的解密或 ⊥(如果 是无效的密文)。然后,它通过运行 来验证 是否为有效密文。如果验证通过,算法返回通过 获得的消息 。否则,返回 ⊥。
CMP14还存在一个关于函数的小的实际问题,该函数为每个数据集绑定一个唯一的质数。它没有检查这个质数与群的阶是否互素。如果不是这种情况,在AEncrypt过程中计算签名值相当于破解RSA假设,而这被认为是不可行的。