Paillier API
功能简介
Paillier 是一个支持加法同态的公钥密码系统 ,由 Paillier 在1999年的欧密会(EUROCRYPT)上首次提出。此后,在 PKC'01 中提出了 Paillier 方案的简化版本26,是当前 Paillier 方案的最优方案。在众多 PHE 方案中,Paillier 方案由于效率较高、安全性证明完备的特点,在各大顶会和实际应用中被广泛使用,是隐私计算场景中最常用的PHE实例化方案之一。
Paillier 仅支持加法同态,故为半同态加密算法,支持密文加法、减法、标量乘法等操作,其中减法可以转换成加法加上负数、标量乘法可以转换成多个相同的项相加,所以均属于加法同态的范畴。
铜锁的 Paillier 实现功能主要包含:Paillier 公钥/私钥的生成和文本显示、明文数字加密和密文解密、密文加法/减法/标量乘法运行、密文数据编码/解码、speed 测试等。
数据结构和头文件
写需要include的头文件、数据结构、宏定义等,为接下来介绍函数做准备
// 头文件
#include <openssl/paillier.h>
// paillier 公/私钥
PAILLIER_KEY *key;
// paillier 操作上下文
PAILLIER_CTX *ctx;
// paillier 密文,用于保存 paillier 加密结果
PAILLIER_CIPHERTEXT *c;
// paillier 类型标志位:目前仅实现了 g 参数优化的类型
# define PAILLIER_FLAG_G_OPTIMIZE 0x01
// PAILLIER_KEY_type 函数返回值,0 表示 paillier 公钥
# define PAILLIER_KEY_TYPE_PUBLIC 0
// PAILLIER_KEY_type 函数返回值,1 表示 paillier 私钥
# define PAILLIER_KEY_TYPE_PRIVATE 1
// paillier 运算支持的最大阈值
# define PAILLIER_MAX_THRESHOLD ((((uint64_t)1) << 63) - 1)
PAILLIER_KEY_new
函数原型
PAILLIER_KEY *PAILLIER_KEY_new(void);
该函数用于创建 paillier key,公钥和私钥均使用该函数创建。
函数参数
参数 | 类型 | 说明 |
---|---|---|
无 |
示例
无
返回值
返回值 | 含义 | 说明 |
---|---|---|
PAILLIER_KEY * | PAILLIER_KEY 对象指针 | |
NULL | 失败 |
版本信息
Tongsuo-8.4.0 以及之后版本支持此特性。
注意事项
函数的返回值需要调用方调用 PAILLIER_KEY_free 来释放其内存。
PAILLIER_KEY_free
函数原型
void PAILLIER_KEY_free(PAILLIER_KEY *key);
该函数用于释放 PAILLIER_KEY 对象内存,当引用计数大于0时不会真正的释放内存而只是将引用计数减1,当引用计数减到0时才会真正释放内存。
函数参数
参数 | 类型 | 说明 |
---|---|---|
key | PAILLIER_KEY * | key 指针 |
示例
无
返回值
返回值 | 含义 | 说明 |
---|---|---|
无 |
版本信息
Tongsuo-8.4.0 以及之后版本支持此特性。
注意事项
无
PAILLIER_KEY_copy
函数原型
PAILLIER_KEY *PAILLIER_KEY_copy(PAILLIER_KEY *dest, PAILLIER_KEY *src);
该函数用于拷贝 PAILLIER_KEY 对象内容,将 src 指针所指的 PAILLIER_KEY 对象拷贝到 dest 指针内存中,dest 和 src 不能为空。
函数参数
参数 | 类型 | 说明 |
---|---|---|
src | PAILLIER_KEY * | 源对象指针 |
dest | PAILLIER_KEY * | 目标对象指针 |
示例
无
返回值
返回值 | 含义 | 说明 |
---|---|---|
PAILLIER_KEY | PAILLIER_KEY 对象指针 | 正常时返回 dest 指针值 |
NULL |
版本信息
Tongsuo-8.4.0 以及之后版本支持此特性。
注意事项
无
PAILLIER_KEY_dup
函数原 型
PAILLIER_KEY *PAILLIER_KEY_dup(PAILLIER_KEY *key);
该函数用于(深拷贝)复制 PAILLIER_KEY 对象。
函数参数
参数 | 类型 | 说明 |
---|---|---|
key | PAILLIER_KEY * |
示例
无
返回值
返回值 | 含义 | 说明 |
---|---|---|
PAILLIER_KEY | 复制的 PAILLIER_KEY 对象指针 | PAILLIER_KEY 对象指针是 new 出来再复制的,该指针需要自己释放 |
NULL |
版本信息
Tongsuo-8.4.0 以及之后版本支持此特性。
注意事项
需要调用 PAILLIER_KEY_free 来释放对象内存。
PAILLIER_KEY_up_ref
函数原型
int PAILLIER_KEY_up_ref(PAILLIER_KEY *key);
该函数是将 PAILLIER_KEY 的引用计数加1。
函数参数
参数 | 类型 | 说明 |
---|---|---|
key | PAILLIER_KEY * |
示例
无
返回值
返回值 | 含义 | 说明 |
---|---|---|
1 | 正常 | |
0 | 出错 |
版本信息
Tongsuo-8.4.0 以及之后版本支持此特性。
注意事项
无
PAILLIER_KEY_generate_key
函数原型
int PAILLIER_KEY_generate_key(PAILLIER_KEY *key, int bits);
该函数用来生成 PAILLIER_KEY 的参数:p、q、n、lambda、u 等。
函数参数
参数 | 类型 | 说明 |
---|---|---|
key | PAILLIER_KEY | |
bits | int | 随机素数 p、q 的二进制位长度 |
示例
无
返回值
返回值 | 含义 | 说明 |
---|---|---|
1 | 正常 | |
0 | 出错 |
版本信息
Tongsuo-8.4.0 以及之后版本支持此特性。
注意事项
无
PAILLIER_KEY_type
函数原型
int PAILLIER_KEY_type(PAILLIER_KEY *key);
该函数是用来获取 key 的类型:公钥 or 私钥。
函数参数
参数 | 类型 | 说明 |
---|---|---|
key | PAILLIER_KEY * |
示例
无
返回值
返回值 | 含义 | 说明 |
---|---|---|
PAILLIER_KEY_TYPE_PUBLIC | 公钥 | 值为0 |
PAILLIER_KEY_TYPE_PRIVATE | 私钥 | 值为1 |
版本信息
Tongsuo-8.4.0 以及之后版本支持此特性。
注意事项
无
PAILLIER_CTX_new
函数原型
PAILLIER_CTX *PAILLIER_CTX_new(PAILLIER_KEY *key, int64_t threshold);
该函数用于创建 PAILLIER_CTX,在后续进行 PAILLIER 操作时需要使用此上下文。