HE同态加密(Microsoft SEAL) 实例小试

HE 在人脸识别中的应用demo 演示文档

说明

  1. 使用的HE方案是CKKS

/
| Encryption parameters :
|   scheme: CKKS
|   poly_modulus_degree: 8192
|   coeff_modulus size: 200 (60 + 40 + 40 + 60) bits
|   scale: pow(2.0,40)
\

  1. 输入数据的长度 n = 10 ,
  2. 因为没有用FaceNet数据集的缘故,演示所用的测试数据来源为简单生成,生成方式为:
  3. 编译平台: Visual Studio 2019
  4. 所需外部环境: seal.h ; examples.hbits/stdc++.h
  5. 项目代码上传至: github: https://github.com/sizaif/SEALExamples/tree/main

数据来源

输入的input数据和database数据来源生成代码如下:

// slot_count = poly_modulus_degree /2  => 4096 
double curr_point = 0;
double step_size = 1.0 / (static_cast<double>(slot_count) - 1); 
ofstream out;
out.open("database.txt", ios::in | ios::out | ios::binary | ios::trunc);
if (out.is_open()) {
   
    int step = 0;
    for (size_t i = 0; i < slot_count; i++)
    {
   
        // 每10行一个数据
        if(step %10 == 9)
            out << curr_point << "\n";
        else {
   
            out << curr_point << " ";
        }
        step++;
        curr_point += step_size;
    }
    out << endl;
    out.close();
    cout << "Input vector: " << endl;
}

选取的input数据如下:

[0.984127 0.984371 0.984615 0.98486 0.985104 0.985348 0.985592 0.985836 0.986081 0.986325]

从生成的database中最后10行中选取第6行生成

image-20210203124141787


选取的database E 数据如下:

[0.974359 0.974603 0.974847 0.975092 0.975336 0.97558 0.975824 0.976068 0.976313 0.976557]
[0.976801 0.977045 0.977289 0.977534 0.977778 0.978022 0.978266 0.97851 0.978755 0.978999]
[0.979243 0.979487 0.979731 0.979976 0.98022 0.980464 0.980708 0.980952 0.981197 0.981441]
[0.981685 0.981929 0.982173 0.982418 0.982662 0.982906 0.98315 0.983394 0.983639 0.983883]
[0.984127 0.984371 0.984615 0.98486 0.985104 0.985348 0.985592 0.985836 0.986081 0.986325]
[0.986569 0.986813 0.987057 0.987302 0.987546 0.98779 0.988034 0.988278 0.988523 0.988767]
[0.989011 0.989255 0.989499 0.989744 0.989988 0.990232 0.990476 0.99072 0.990965 0.991209]
[0.991453 0.991697 0.991941 0.992186 0.99243 0.992674 0.992918 0.993162 0.993407 0.993651]
[0.993895 0.994139 0.994383 0.994628 0.994872 0.995116 0.99536 0.995604 0.995849 0.996093]
[0.996337 0.996581 0.996825 0.99707 0.997314 0.997558 0.997802 0.998046 0.998291 0.998535]


image-20210203124350026

过程步骤

总览

image-20210203193037721

  1. 首先计算 p 与 E 中的 C i C_{i} Ci 比较分数并用 r i r_{i} ri表示,求最佳的 r i r_{i} ri,

    r i = dist ⁡ ( p , c i ) ⋅ k \mathbf{r}_{i}=\operatorname{dist}\left(\mathbf{p}, \mathbf{c}_{i}\right) \cdot \mathbf{k} ri=dist(p,ci)k ; k = { 1 , 0 , . . . 0 } k=\left \{ 1,0,...0 \right \} k={ 1,0,...0}

  2. 处理完全部数据库内容后,N个单独结果的vector R = [ r 1 r 2 ⋮ r N ] = [ ( r 1 , 1 , 0 , … 0 ) ( r 2 , 1 , 0 , … 0 ) ⋮ ( r N , 1 , 0 , … 0 ) ] \mathbf{R}=\left[\begin{array}{c}\mathbf{r}_{1} \\ \mathbf{r}_{2} \\ \vdots \\ \mathbf{r}_{N}\end{array}\right]=\left[\begin{array}{c}\left(\mathbf{r}_{1,1}, 0, \ldots 0\right) \\ \left(\mathbf{r}_{2,1}, 0, \ldots 0\right) \\ \vdots \\ \left(\mathbf{r}_{N, 1}, 0, \ldots 0\right)\end{array}\right] R=r1r2rN=(r1,1,0,0)(r2,1,0,0)(rN,1,0,0) 每个 r i r_{i} ri是单独加密的, 可以随机打乱 r i r_{i} ri的顺序

  3. 通过将 r i r_{i} ri移位,变成对角矩阵 例如 R = [ ( r 1 , 1 , 0 , … 0 ) ( 0 , r 2 , 1 , … 0 ) ⋮ ( 0 , 0 , … r N , 1 )

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值